西门子1500 CM PtP RS422/485 BA 模块 自由口 实现 Modbus RTU 通信

目录

前情提要

程序解析

主站

从站

CRC16校验

使用截图

注意事项


 

前情提要

大家好,我是工控从业时长一坤年的邦邦(鞠躬

//---------------------------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------//

本需要通过RS485接口,实现 Modbus RTU 通信,选模块时相中了这两款(名称中都带有485字样),由于项目还是招标阶段匆忙选择了较经济的BA这一款。

b5ce991d481247d596466a6f378c260c.png

但是到货后发现BA款只能实现自由口通讯,无法直接使用博图中自带的Modbus RTU相关通讯指令,而HF款是可以可,BA需要自己写 。。。 😶-_- ......

(以后记得用HF的!!!!!

7ea161b496f8418bbc21416edf6b5f2b.pngb28c514a9cde4f8aa8b76cf539f744b2.png

(上图为BA和HA的产品简介,确实BA不支持Modbus)

05071c5748dc435688f514c75ecd3e30.png025c4dd7ac6a46f4b25a2e44461e0084.png

(上图为博图自带 Modbus RTU相关通讯指令 与 自由口指令)

搜索的资料基本都是对于BA模块的介绍及  Send_P2P  /  Receive_P2P  (自由口发送和接收)两条指令的介绍,对于小白的我来说根本无从下手。。。

 

后找到一篇关于自由口实现Modbus RTU通讯的文章

⭐传送门:西门子RS485自由口通信Modbus RTU 通信协议_自由口通讯协议-CSDN博客

本文在原帖基础上增加了从站通讯功能,并且附加CRC16校验(原帖没有,但其实搜一下有很多案例)。

由于本人对涉及通讯方面的知识了解较少,能力有限,所以很多通讯错误的报警判断阉割掉了。。

/以能用为目标//以能用为目标//以能用为目标(重要事情说三遍)

//---------------------------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------//

程序详情

1.主站

 FB块的变量定义

7ed66bfb322341598a06fa5c26bc71fe.png

主站程序



IF #触发 THEN
    // 触发后先将读取完成复位
    #读写完成 := 0;
    #读写错误 := 0;
    #扫描次数 := 0;
    #校验信息 := 16#6001;
END_IF;

#扫描次数 := #扫描次数 + 1;

//读写超时
IF #扫描次数 > 10 THEN
    #读写完成 := 0;
    #读写错误 := 1;
    #校验信息 := 16#6002;
    RETURN;
END_IF;
REGION _name_
    // Statement section REGION
    
END_REGION

CASE #功能码 OF
    1:  // Statement section case 1
        ;
    2:  // Statement section case 2 
        ;
    3:  // Statement section case 3 
        //拼接报文
        #临时报文[0] := UINT_TO_BYTE(#从站号);//从站地址
        #临时报文[1] := UINT_TO_BYTE(16#03);//功能码
        #临时报文[2] := UINT_TO_BYTE(#起始地址 / 256);//起始寄存器高位
        #临时报文[3] := UINT_TO_BYTE(#起始地址 MOD 256);//起始寄存器低位
        #临时报文[4] := UINT_TO_BYTE(#读写长度 / 256);//寄存器数量高位
        #临时报文[5] := UINT_TO_BYTE(#读写长度 MOD 256);//寄存器数量低位


        "CRC16校验"(校验字节数 := 6,
             校验数据 := #临时报文);
           //截取报文
        #截取结果 := MOVE_BLK_VARIANT(SRC := #临时报文,
                                  COUNT := 8,
                                  SRC_INDEX := 0,
                                  DEST_INDEX := 0,
                                  DEST => #读取发送报文);
        
        #Send_P2P_Instance(REQ := #触发,
                           "PORT" := #硬件标识符,
                           BUFFER := #读取发送报文,
                           LENGTH := 8,
                           DONE => #发送完成,
                           ERROR => #发送错误,
                           STATUS =>
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值