西门子SmartPLC自由口通讯封装兼容Modbus_可自定义报文格式
最近一直在用西门子SmartPLC,由于项目需求自定义协议,为了数据的准确性用了CRC校验,模块兼容Modbus_RTU,自定义报文格式。
此模块主要用的是SmartPLC,指针类型,通过寻址自动在发送数据末端端添加CRC校验,数据接端通过接收到的数据通过CRC校验数据的准确性。参考西门子官网自由口通讯程序并进行二次封装。官网链接:官网程序参考链接,程序适合做参考和根据自己的业务优化,有更好的思路可以评论区留言。
1、程序框架四部分
子程序名称
Proc(SBR6) --------------------------- COM0_Init //端口初始化配置
Proc(INT0) --------------------------- COM0SendDataFinish //发送数据完成进入中断程序
Proc(SBR1) --------------------------- CRC_16 //CRC数据校验
Proc(SBR7) --------------------------- COM0_sys //发送和接收程序及数据校验
Proc(SBR5)---------------------------- SensorSys //调用测试
符号表:定义的是必须的全局变量,因为在中断中不支持地址传入(试过好多方式都失败),不知道有没有大神知道
VB7500------------------------------- StepCOM0Global //通讯中用的执行步数标志
VB7700------------------------------- ReciveBufCOM0Global //接收数据的缓冲区,最大接收255个字节,到8000的地址尽量都别用
VB7504------------------------------- TimeCOM0Global //接收数据系统开始时间
VB7508------------------------------- OverTimeCOM0Global //保存等待接收数据的时长
2、COM0_Init 程序块
初始化程序直接截图就不过多的介绍了,官方手册上有说明。
接收数据设定100个字节可以根据需求去修改。
3、COM0SendDataFinish 程序块
中断程序块,看官网示例里面有说明。
定义的公用变量主要用在中断中。
4、CRC_16 数据校验
网上一大堆讲解需要的自行搜索理解。
5、COM0_sys 发送接收主程序
5.1 输入参数的基本介绍局部变量。
L0.0------------------------------------ StartMasterBit //主站Bit位,开始执行程序
LD1------------------------------------ NumSendByte //发送数据的字节数,发送多少位字节
LD5------------------------------------ ErrRs485Byte //通讯错误 0/1,判断标准是从站是否有返回数据。100ms无返回就判断异常置1
LD9------------------------------------ ErrDataByte //数据接收到后,CRC校验,如果错误置地址为1
LD13---------------------------------- ReveiceDataBuf //数据的接收地址,可以根据自己寄存器的定义去动态修改接收的地址
LW17---------------------------------- CountCrc //临时变量,发送数据需要校验的位数
LW19 --------------------------------- CRCresult //数据校验结果
LW21 --------------------------------- ReveiceCRCresult //接收数据校验和
5.2 主调用程序段:SensorSys
结合实际数据调用情况分析。
发送的数据位8个字节:04 03 00 00 00 09 xx xx
下面(图①) 调用和定义
图①
程序段1:COM0_sys 根据(图①)传入的参数进行分析
要根据标记符号的颜色及标记符号的顺序理解计算地址和地址的值 ,即可看懂(写的时候没注意细节)
程序段1数据发送完成,进入上图的中断程序,后进入程序段2,官网中有中断及例子的说明,自行看即可。
程序段2:COM0_sys 结合官网例子说明结合查看
程序段3: COM0_sys 手动关闭接收数据
程序段4:COM0_sys 接收的数据进行CRC校验
程序段5:COM0_sys 数据接收赋值,并清除缓存区数据,进行下次通讯
实际应用测试 SensorSys
下图是发送出来的数据:04 03 00 00 00 09 CRC校验
接收到的数据:正常状态
断线状态:
数据异常状态:
总结
上面程序就是简单的用在项目的指针应用,我们可以传入很少的参数,做业务逻辑,同时可以节省有限的子程序变量,可以通过很少的程序块来完成项目。减少硬件内存的字节数。可以用内存小的PLC,做一些复杂的项目。提高自己的编程能力,深层次的了解PLC的运行原理。
程序还有很多不足之处,希望大神在评论区指出。
如有需要程序参考,请联系邮箱:httpcc@163.com