关于200smart通讯的校验程序之校验程序

已锁定

WWCWWC

西门子1847工业学习平台

  • 帖子

    9109
  • 精华

    157
  • 被关注

    1473

论坛等级:至圣

注册时间:2008-07-26

钻石 钻石 如何晋级?

关于200smart通讯的校验程序之校验程序

5517

2

2016-11-23 09:37:37

                                 关于200smart通讯的校验程序之校验程序

    昨天在“找答案”看到有网友提问,关于自由口通讯时的校验是如何计算的,由于当时没有及时回复这个计算过程,现想来说说这个话题。

    以下按自由口通讯时常用的ASCLL码通讯方式的LRC校验为例,来说明这个问题。

    首先说说这个校验的算法:将参与校验的数据求和,并将数据和的补码的低八位作为校验码,补码:将原码(原值)取反后再加1。其含义是将参与通讯的数据进行一一累加,累加后取数据的低八位值再进行取反操作,结果后的个位数再加1。假设通讯数据是VB0开始的10个数据,分别,01、02、03、04、05、06、07、08、09、10,这样累加后的数据和是55。先把它转换为二进制格式为:110111(取低八位数据)。八位数据高位不足的在前面加0后得:00110111,取反后得:11001000,再在校验结果后加1,得:11001001,这个就是理论计算LRC校验算法后的结果。

下面用校验程序来验证、说明:

1)打开软件新建一个通讯校验程序,并建立一个子程序命名为“LRC校验”,图示1:


2)在子程序里,建立一些需要的变量表,并标注符号及数据类型,图示2:当然你也可以边编程边添加变量,变量地址系统自动分配。


3)根据LRC校验程序要求编程思路编程,图示3:200smart V2.1软件在编辑子程序时,符号名称会有红色波浪线,这在之前大家都有碰到,并热烈讨论过次话题,这里先不管这些,属于正常范畴。


1)初始化参与校验的个数(校验数据清零)及参与校验的临时数据

2)将参与校验的数据写指针(B_I指令)

3)参与校验的数据进行累加,并记录校验次数

4)编写循环体(实现参与校验的数据累加)

5)将结果先取反(INV_W),然后加1

6)取低八位数据

7)在主程序中调用这个校验子程序,并用沿触发计算校验,图示4:


8)程序编译保存后下载到cpu中,并新建一个“状态图标”,写入由VB0开始的数据,图示5:


9)当启动M0.0后,LRC正确的校验值应该是:11001001,反之,还需要检查程序的合法性,使能M0.0后,校验结果看VB100,图示6:


程序计算结果是吻合理论计算结果的,说明这个校验程序正确。

  好,开始回答正题了,问题的起因“请问各位大师:自由口通讯接收到的数据是:3E+,30,30,35,45,3  4,37,30,30,32,30,44,30,+42,39+,0D,第一个数据3E是开始符,最后的0D是结束符,中间的30.30......到44.30这12个数据是需要传输的内容,然后结束符0D前面的42  . 39两个数据应该是校验码,
现在的问题是:12个数据的ASCII码是005E470020D0,累加取反加一也不对啊/头疼,能不能演示一下计算过程,谢谢了!由于没有说明书,我按照BCC和LRC的算法都算过,都没办法等于
校验码42.39(B9)求大师上传计算步骤,我已经变着法算了好多次,所以大师最好按照我的数据算一下,并把过程也上传,不然帮不到我呀!谢谢!”

   我把16进制数,分别写入由VB0开始的12个字节中,并修改参与LRC校验的个数为12,分别输入数据:30,30,35,45,34,37,30,30,32,30,44,30

校验后的结果是:2#10000101,转换为16#85。图示7:


由此说明网友这个通讯校验程序是非LRC校验,那可能会是CRC校验?

那再来编一个CRC校验试试,编写CRC校验的思路:

1)设置CRC储存器为16#FFFF

2)把第一个参与校验的八位数与CRC的低八位进行异或运算,结果存放在CRC

3)把CRC右移一位,最高位补0,检查最低位b0

4)如果b0 = 0,则CRC不变,如果b0 = 1,CRC与16#A001进行异或运算,结果存放在CRC

5)重复第三 ~ 第四步骤,一直到右移8位结束,结果存放在CRC

6)重复第二 ~ 第五步骤,处理第二个待校验数据

 

1)新建一个CRC校验程序,并新建一个子程序命名为CRC校验,图示8:


2)新建子程序变量表,并按CRC编程思路写入变量名称、定义数据类型,图示9:


3)编写CRC校验程序,图示10:


4)编译无错误后,在主程序中调用CRC校验子程序,并用上升沿触发,下载到cpu中,按测试要求在“状态图标”中分别输入由VB0开始的12个数据,图示11:


根据要求的数据进行CRC校验,测试结果为16#4DF9。

    从一般自由口通讯报文来看,网友的通讯数据除“起始符”开始的第二个数据应该是“地址码”,第三个数据应该是“指令类型”,一般是不参与校验的数据地址,这样说来只能是10数据参与校验了,那采用LRC校验方式试试结果如何?


再采用CRC校验来看这10个数据的结果?


   那如果还有在最后一个是停止数据位也不参与校验呢,采用LRC试试?相当于参与的数据只剩下9个,去掉最后一个16#30.

取消2个停止位的结果?


用CRC试试情况?


   那位网友得到的通讯数据校验结果且且是16#B9,也是非CRC校验的结果值。就算有些通讯数据的结果需要字节交换,也不可能是这个值。由此推断,网友的校验仍然也不是CRC校验程序计算出来的结果,排除了上述2种校验方法。如果这位网友能够看到此文档,请提供具体真实的校验方法,以方便编程来验证结果。


关于200smart通讯的校验程序之校验程序 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8941条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。