西门子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

 

 

 

 

 

 

     

 

posted @ 2022-08-27 12:13  httpcc  阅读(1864)  评论(0编辑  收藏  举报