草庐IT

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

优雅の疯子 2023-03-28 原文

  最近一直在用西门子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

 

 

 

 

 

 

     

 

有关西门子SmartPLC自由口通讯封装兼容Modbus_可自定义报文格式的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐