刚从外地返回来,没能及时回复你的回帖,非常抱歉。
根据你的提示,我又重新看了周立功的有关modbustcp库中对#03和#04指令的定义,结合我们aardio 对modbustcp库的#03和#0的对比,发现周立功的#03和#04指令中的@5参数全是WORD,而 aardio 的modbustcp中#03指令引用的是string,可用!而#04指令引用的是WORD,出现错误,于是我把aardio的modbustcp协议中的#04指令中的@5参数由WORD改成了string,结果成功了,
125
ZMB_ReadHoldReg = dll.api( /*03功能码读保持寄存器*/ "ZMB_ReadHoldReg", "int( INT hand, BYTE serID, int nStart, int nCount, string &bRet, WORD TranID)");
126
ZMB_ReadInputReg = dll.api( /*04功能码读输入寄存器*/ "ZMB_ReadInputReg", "int( INT hand, BYTE serID, int nStart, int nCount, WORD string& Ret, WORD TranID)");
不知对否,供参考
//以下是用aardio 自带的modbus库完成同一功能的
import modbus.modbustcp; //协议修改的内容见上
var m = modbus.modbustcp();
winform.button2.oncommand = function(id,event){
var ip = "10.168.3.75";
var port = 502;
var timeout = 50;
var handle = m.tcpConnect(ip, 502, 50);
var v = m.readHoldingRegisters(1, 100, 8); //用modbus读取寄存器的值
var w = m.readInputRegisters(1, 0, 3); //读取输入寄存器的值,现在可用了
var currDT = tostring(time(time.now(),"%Y-%m-%d %H:%M:%S")); //当前日期
winform.edit3.print(currDT);
winform.edit3.print("输入寄存器=");
for i=1;3;1 {
winform.edit3.print(math.round(tonumber(w[i],16)/10000,2)); //保持小数点后两位。
}
winform.edit3.print("--------------");
winform.edit3.print("保持寄存器=");
for i=1;8;1 {
winform.edit3.print(tonumber(v[i],16)/100);
}
//winform.edit3.print(v);
winform.edit3.print("--------------");
}
winform.show();
win.loopMessage();
![](https://aar.chengxu.online/upload/files/20240305/1709609006.png)
能否帮我把竖排的数值改为横排的,我找了很长时间也没找到。麻烦你了。