以下會使用到的函式有[ReadDeviceBlock2]。
在實務上讀取建議一次性把所有的範圍讀取回來通訊為最省時,如果把抓回來的數值再丟到記憶體做處理會再快一咪咪。
以下由FX5U的D值(0~7999)與M值(0~7679)做示範
public short[] D_List = new short[8000];
public short[] M_List = new short[480];
plc.ReadDeviceBlock2("D0", D_List.Length, out D_List[0]);
plc.ReadDeviceBlock2("M0", M_List.Length, out M_List[0]);
在這邊可能會有人有疑問M值共有7680個為何陣列大小為480,手冊[375]頁說明讀取M值時1代表16個bit也就是說如果只讀取1個值這個數值就代表M0~M15,所以陣列大小為 7680/16=480。
可能又會有第二個疑問,如何正確得知M1234的狀態為何?
這部分只需要一點計算就可以知道M1234在M_List的第幾個索引中的第幾個bit。
//1.計算M_List索引
int i_value = (int)(address / 16);
//2.計算第幾個bit
int bit_index = address % 16;
利用上述的運算就可以做出自己要用的函式
public bool GetPLC_bit_Statue(short[] list, int address)
{
bool[] bit = new bool[16];
int i_value = (int)(address / 16);
int bit_index = address % 16;
Word_To_bit16(list[i_value], ref bit);
return bit[bit_index];
}
//使用方法
bool b = GetPLC_bit_Statue(M_List, 1234);
再來就是DWord,假設D3~4為一個DWord數值
int dword = (int)((D_List[3] & 0xFFFF) | ((D_List[4] & 0xFFFF) << 16));
只要了解如何把數值轉成bit、word、dword就可以隨意組合你想要的資料型式。