Modbus TCP&modbus rtu协议库 上位机开发/修复04功能码

axuanup 7月前 1407

最新回复 (34)
  • 13500720415 6月前
    0 21
    谢谢回复。 我的主导思想就是:咱们的modbus协议库关于#04指令有点问题,稍许改动,就可以使我们的modbus协议正常运行,应该与硬件无关。我的建议,仅供参考。
  • 光庆 6月前
    0 22
    13500720415 谢谢回复。 我的主导思想就是:咱们的modbus协议库关于#04指令有点问题,稍许改动,就可以使我们的modbus协议正常运行,应该与硬件无关。我的建议,仅供参考。

    不好意思啊,误会了,现在看明白了,你这是已经修复后的。

  • 13500720415 6月前
    0 23
    是的,我只想请求把aardio的mogbus协议中的小错误改正一下,但我又不会改,我现在还没有修复这个错误的能力。实在抱歉。
  • 光庆 6月前
    0 24
    13500720415 是的,我只想请求把aardio的mogbus协议中的小错误改正一下,但我又不会改,我现在还没有修复这个错误的能力。实在抱歉。

    还是因为没法测试,只能根据api定义,给你改一下,你自己测试一下:

    1、dll 声明先将var 去掉

    var dll = ..raw.loadDll(path)

    改为

     dll = ..raw.loadDll(path)

    2、readInputRegisters 函数定义改为:

        readInputRegisters = function(id, addr, count) {
            if (this.handle) {
                var buff = {
                	word w[] = {length = count}
                }
                dll.ZMB_ReadInputReg(this.handle, id, addr, count, buff, 0)
                //返回一个表
                return buff.w;
            }
        }


  • 光庆 6月前
    0 25

    或这样:

    1、ZMB_ReadInputReg 定义改为:

        ZMB_ReadInputReg = dll.api( /*04功能码读输入寄存器*/ "ZMB_ReadInputReg", "int( INT hand, BYTE serID, int nStart, int nCount,struct &bRet, WORD TranID)");

    2、readInputRegisters 定义改为:

        readInputRegisters = function(id, addr, count) {
            if (this.handle) {
                var buff = {
                	word w[] = {length = count};
                }
                ZMB_ReadInputReg(this.handle, id, addr, count, buff, 0);
                //返回一个表
                return buff.w;
            }
        }


  • 13500720415 6月前
    0 26

    刚从外地返回来,没能及时回复你的回帖,非常抱歉。

    根据你的提示,我又重新看了周立功的有关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();


    能否帮我把竖排的数值改为横排的,我找了很长时间也没找到。麻烦你了。





  • 13500720415 6月前
    0 27
    这是两个现场的数值,数据不一样
  • 13500720415 6月前
    0 28
    谢谢光庆的指导,,我采用的是您第二个方案,立马成功,修改了aardio标准库中modbus协议里的一个bug,现在运行正常。
  • mndsoft 1月前
    0 29
    请问楼主,ZMB_WriteCmdBuf 和 ZMB_ReadRecBuf这个功能函数没有封装进去,这2个是不是可以自定义功能码收发的?比如有些设备貌似扩展了功能码,方便的话能否加近期库,谢谢
  • axuanup 1月前
    0 30
    没留意这个函数
  • mndsoft 1月前
    0 31

    楼主帮忙看下 ZMB_WriteCmdBuf 这个函数,我照你的改了下提示错误。

    调用:m.WriteCmdBuf({1;48;240;0;0;10},6)


        //自定义写命令串 hand,BYTE *pBuf,int iLen,int nAddCheck,WORD TranID;
        //TranID 在 TCP 的 MODBUS 协议里需要用到任务 ID 号,如果为 0 使用系统自生成的,串口MODBUS 此参数无效。
        WriteCmdBuf = function(data,num ) {
            if (this.handle) {
                var n = bytetoew(data, self.wordtobyte)
                n = self.ertoyi(n, #n, 2)
                self.ZMB_WriteCmdBuf(this.handle,self.tobuffer(n),n, 0)
            }
        }


  • mndsoft 1月前
    0 32

    在学习楼主这个库函数,我让 claude-3.5-sonnet 解释下 这个函数

        //word类型转byte类型
        wordtobyte = function(w) {
            var t = {}
            t[1] = w & 0x00FF;
            t[2] = (w >> 8) & 0x00FF;
            return t;
        }

    claude-3.5-sonnet 解释如下,楼主觉得 claude-3.5-sonnet解释的对吗?

  • mndsoft 1月前
    0 33

    又让解释了 claude-3.5-sonnet  这个函数,感觉解释的还是挺不错。

        //16功能码,写多个寄存器
        writeMultipleRegisters = function(id, addr, num, data) {
            if (this.handle) {
                var n = bytetoew(data, self.wordtobyte)
                n = self.ertoyi(n, #n, 2)
                self.ZMB_WriteRegMulitiple(this.handle, id, addr, num, self.tobuffer(n), 0)
            }
        }

  • axuanup 1月前
    0 34
    我现在都用easymodbus
  • axuanup 1月前
    0 35
    或者是自己封装协议库,我用到的基本上都是非标协议
返回