前一篇讲过,如何利用Mx Componet组件与三菱PLC连接,下一个问题就涉及到读写,你跑不掉的
有了官方组件,直接调用不就行了,对不对?对不对?
对!!!!
前提是不踩坑
首先,有这个方法GetDevice(string szDevice, out int lplData),第一个是寄存器地址,傻瓜式调用,总之就是很方便有木有?有木有?
但是这个方法一次只能读取一个寄存器
没事,问题不大,我还有ReadDeviceBlock(string szDevice, int lSize, out int lplData)
手册里面的描述是
软元件的批量读取-从通过 szDevice(varDevice) 指定的软元件开始,将 lSize(varSize) 容量的软元件值作为 SHORT 型的数据进 行批量读取。 · 读取的软元件值将被存储到 iData(lpsData 或 lpvarData) 中。 · 对于 iData(lpsData 或 lpvarData),应预留出 lSize(varSize) 容量以上的数组
在 lSize(varSize) 中可指定的最大读取点数为满足下述条件的范围。 读取开始软元件编号 + 读取点数≤最终软元件编号
指定位软元件时,对软元件编号可以以 16 的倍数进行指定。
对于 iData(lpsData 或 lpvarData),应预留出相当于 lSize(varSize) 中指定点数的存储器区域。 没有存储器区域的情况下,有可能会发生应用程序出错等严重现象
手册里面有VB\VC\C++\VBS\VBA的范例,偏偏没有C#的,讲道理我只看了个半懂,就只能自己尝试
int = -1;
int resCode = PlcConnObj.ReadDeviceBlock(“SD210”, 16, out readData);
乍一看没问题,仔细想想,不对劲
我是批量读取,那么输出参数应该是一个集合,不该是一个int啊?
运行程序,结果也证明了,读出来的只有一个值,不科学?啊呸!科学?毛毛?!
总之一番纠结过后,做了个尝试
int[] resData = new int[16];
int resCode = PlcConnObj.ReadDeviceBlock(“SD210”, 16, out resData[0]);
注意最后一个参数
运行程序,数值都填充在数组里面了
没错,就酱
想想还真是有点坑,因为根据程序集里面的封装,第一反应是传入一个int型而非数组,很难想到会用这样的方式去传递
有些东西,不去尝试,永远不知道结果
就酱,掰掰