首页 > 其他分享 >西门子SmartPLC自由口通讯封装兼容Modbus_可自定义报文格式

西门子SmartPLC自由口通讯封装兼容Modbus_可自定义报文格式

时间:2022-08-27 12:22:29浏览次数:90  
标签:自定义 SmartPLC 报文格式 COM0 程序 校验 CRC 数据 程序段

  最近一直在用西门子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的运行原理。

       程序还有很多不足之处,希望大神在评论区指出。

       如有需要程序参考,请联系邮箱:[email protected]

 

 

 

 

 

 

     

 

标签:自定义,SmartPLC,报文格式,COM0,程序,校验,CRC,数据,程序段
From: https://www.cnblogs.com/httpcc/p/16582696.html

相关文章

  • java自定义stream
    一、流程1//自定义集合,继承ArrayList,与ArrayList没啥区别SelfList<Apple>appleList=newSelfList<>();importjava.util.ArrayList;importjav......
  • KingbaseES V8R3集群运维案例之---用户自定义表空间管理
    ​案例说明:KingbaseES数据库支持用户自定义表空间的创建,并建议表空间的文件存储路径配置到数据库的data目录之外。本案例复现了,当用户自定义表空间存储路径配置到data下......
  • VSCode添加自定义的Vue3.2标准模板
    创建新的用户片段 点击文件——首选项——用户片段或者用快捷Ctrl+Shift+P唤出控制台然后输入“snippets”并选择接着输入vuevscode自动生成vue.json文件{......
  • Mysql 自定义随机字符串
    Mysql自定义随机字符串-搬砖工奶爸-博客园 https://www.cnblogs.com/--net/p/5784371.html 前几天在开发一个系统,需要用到随机字符串,但是mysql的库函数有没有直......
  • 使用函数计算自定义运行时快速部署一个 SpringBoot 项目 | 文末有礼
    作者:谱一段风华笔墨什么是函数计算阿里云函数计算FC是事件驱动的全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为您准......
  • 在uniapp目录下的uni_module中创建自定义组件
    一、前言  在使用uni-app框架时,可能里面的内置组件和扩展组件都不是我们想要的,或者不能满足我们的需求,这时就必须得创建自定义组件了,在低版本的HbuilderX中所有的组......
  • 注解-JDK内置注解以及自定义注解-格式&本质
    JDK内置注解JDK中预定义的一些注解:1,@Override-检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。2,@Deprecated-标记过时方......
  • arduino自定义库c与c++的区别
    起初是想把手头的红牛开发板的基于stm32标准库的例子都改成用arduino库的   发现arduino库是基于hal库的 不是直接把c文件挪过来就能用的arduino是c++编译器 如......
  • zabbix自定义监控
    zabbix深入自定义监控zabbix多条件触发监控内存可用的百分比UserParameter=mem.available,free-m|awk'NR==2{print$NF/$2*100}'目前属于单条件触发器,因为内存低......
  • 自定义设置Windows右键新建菜单的方法
    win+r,regedit计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNewHKEY_CURRENT_USER\Software\Microsoft......