再啰嗦几句,我用aardio标准库的modbustcp协议库,和用aardio通过python的第三方库modbus_tk,进行采集现场数据对比,感觉速度上前者要比后者快很多,只可惜我们的标准库#04指令有问题,无法运行,以下是我的测试程序:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="调用 python 执行 modbus 数据采集";left=24;top=64;right=376;bottom=144;border=1;color=14120960;db=1;dr=1;font=LOGFONT(h=-14);note="每次点击都会重绘一次";z=2};
button2={cls="button";text="aardio 执行 modbus 数据采集";left=392;top=64;right=744;bottom=144;border=1;color=14120960;db=1;dr=1;font=LOGFONT(h=-14);z=3};
edit={cls="edit";left=24;top=176;right=376;bottom=432;edge=1;hscroll=1;multiline=1;vscroll=1;z=1};
edit3={cls="edit";left=392;top=176;right=744;bottom=432;edge=1;hscroll=1;multiline=1;vscroll=1;z=4}
)
/*}}*/
//以下是借用python的modbus_tk库
import py3; //aardio调用python
import process.python;
//import process.python.pip;
var pyCode = /**
import time
import datetime
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
ip = "10.168.4.75"
port = 502
master = mt.TcpMaster(ip, 502)
master.set_timeout(50.0)
tn=datetime.datetime.now() # 返回当前的datetime日期类型
aa = master.execute(1,md.READ_HOLDING_REGISTERS,100,8)
bb = master.execute(1,md.READ_INPUT_REGISTERS,0,3)
aa1 = list(aa)
for j, item in enumerate(aa1):
aa1[j] = round(aa1[j]/100,2) # 工程数据,小数点后2位
bb1 = list(bb)
for k, item in enumerate(bb1):
bb1[k] = round(bb[k]/10000,2) #数字改变,小数点2位
print("时间:",tn)
print("输入寄存器",bb1)
print("保持寄存器",aa1)
print("---------------------")
**/
py3.exec(pyCode);
winform.button.oncommand = function(id,event) {
var reslist = process.python.exec(pyCode); // 执行Python脚本
reslist.logResponse(winform.edit); //第二种:python程序的执行方法!!
}
//以下是用aardio 自带的modbus库完成同一功能的
import modbus.modbustcp; //取寄存器的值
var m = modbus.modbustcp();
var ip = "10.168.3.75";
var port = 502;
var timeout = 50;
var handle = m.tcpConnect(ip, port, timeout);
winform.button2.oncommand = function(id,event){
var v = m.readHoldingRegisters(1, 100, 8); //用modbus读取寄存器的值
//var w = m.readInputRegisters(1, 0, 3); //w = 预期得到 number,实际获取为 buffer,错误!!
var currDT = tostring(time(time.now(),"%Y-%m-%d %H:%M:%S")); //当前日期
winform.edit3.print(currDT);
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();
/**
aardio语言简单明了,运行速度还很快。
如果把自身的modbus库解决好,
完全不必通过python的第三方库费力的去处理。
**/
这是监测站的两个虚拟局域网的地址,正常运行时,用的是组态软件进行的。
另外,如何将数据竖排改成横排,改成左边的方式,请提示。
拜个晚年,祝阖家团圆,工作愉快。