以下会使用到的函式有[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.计算第几个bitint 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就可以随意组合你想要的资料型式。