作者 | 主题 |
---|---|
剑心倾城 游士 经验值: 184 发帖数: 17 精华帖: 0 |
楼主 2021-09-24 10:50:48
主题:有一个信息校验的程序没有看明白,有没有大神帮忙分析一下的,谢谢 L 0 T #Checksum L DINT#0 T #TEMP13 CLR = #Error AN #Start SAVE BEC OPN #DB_Mode_43 CDB L DW#16#85000000 LAR2 L P##First_Sign LAR1 L 0 L W [ AR1 , P#0.0 ] ==I JZ M002 T #TEMP10 OPN DB [ #TEMP10] M002: NOP 0 L D [ AR1 , P#2.0 ] LAR1 L #Length L 1 <I = #Error JC M001 TAK M003: T #TEMP11 L B [ AR1 , P#0.0 ] T #TEMP14 L DW#16#85000000 LAR2 L 43 M004: T #TEMP12 L #TEMP14 L B [ AR2 , P#0.0 ] ==I JC M005 +AR2 P#1.0 L #TEMP12 LOOP M004 SET = #Error JU M001 M005: TAR2 L DW#16#FFFFFF AD SRD 3 L #TEMP13 +D T #TEMP13 +AR1 P#1.0 L #TEMP11 LOOP M003 L #TEMP13 L 43 MOD SLD 3 L DW#16#85000000 OD LAR2 L B [ AR2 , P#0.0 ] T #Checksum 数据区DB91.DBB430是一个字符组,格式是XK1AAAABBBP,通过前11位数据计算第12位校验码。例如,计算得到AAAA数据是0.77,数据显示为:XK1+077+000(),然后计算最后括号内数据,带入计算是'L'也就是最终数据显示XK1+077+000L, 可不可以麻烦各位大神帮忙分析一下具体是怎样计算的,谢谢 附录:以下是DB块中内容,按照偏移位,从0-9,然后从A到Z. ZEICHEN Struct 0.0 False True True True False Z00 Char 0.0 '0' False True True True False Z01 Char 1.0 '1' False True True True False Z02 Char 2.0 '2' False True True True False Z03 Char 3.0 '3' False True True True False Z04 Char 4.0 '4' False True True True False Z05 Char 5.0 '5' False True True True False Z06 Char 6.0 '6' False True True True False Z07 Char 7.0 '7' False True True True False Z08 Char 8.0 '8' False True True True False Z09 Char 9.0 '9' False True True True False Z10 Char 10.0 'A' False True True True False Z11 Char 11.0 'B' False True True True False Z12 Char 12.0 'C' False True True True False Z13 Char 13.0 'D' False True True True False Z14 Char 14.0 'E' False True True True False Z15 Char 15.0 'F' False True True True False Z16 Char 16.0 'G' False True True True False Z17 Char 17.0 'H' False True True True False Z18 Char 18.0 'I' False True True True False Z19 Char 19.0 'J' False True True True False Z20 Char 20.0 'K' False True True True False Z21 Char 21.0 'L' False True True True False Z22 Char 22.0 'M' False True True True False Z23 Char 23.0 'N' False True True True False Z24 Char 24.0 'O' False True True True False Z25 Char 25.0 'P' False True True True False Z26 Char 26.0 'Q' False True True True False Z27 Char 27.0 'R' False True True True False Z28 Char 28.0 'S' False True True True False Z29 Char 29.0 'T' False True True True False Z30 Char 30.0 'U' False True True True False Z31 Char 31.0 'V' False True True True False Z32 Char 32.0 'W' False True True True False Z33 Char 33.0 'X' False True True True False Z34 Char 34.0 'Y' False True True True False Z35 Char 35.0 'Z' False True True True False Z36 Char 36.0 '-' False True True True False Z37 Char 37.0 '.' False True True True False Z38 Char 38.0 ' ' False True True True False Z39 Char 39.0 '$$' False True True True False Z40 Char 40.0 '/' False True True True False Z41 Char 41.0 '+' False True True True False Z42 Char 42.0 '%' False True True True False Z43 Char 43.0 '#' False True True True False Z44 Char 44.0 '&' False True True True False Z45 Char 45.0 '*' False True True True False Z46 Char 46.0 '=' False True True True False RES Array[48..99] of Char 48.0 False True True True False
工控菜鸟,希望多向大家学习。
|
kenshinguo 侠圣 经验值: 2625 发帖数: 734 精华帖: 3 |
1楼 2021-09-24 15:34:34
主题:回复:有一个信息校验的程序没有看明白,有没有大神帮忙分析一下的,谢谢 看不到你发的DB74的内容。 字面上理解的话,DB74存储了43个字符,校验过程是:查找待校验字符组里每一个字符在DB74里面的位置,如果查不到匹配的就报错,查到了就把位置信息累加起来。最后11个字符的位置索引全部累加后,取43的余数,在DB74里面返回这个余数位置上的字符。 |
kenshinguo 侠圣 经验值: 2625 发帖数: 734 精华帖: 3 |
2楼 2021-09-24 16:27:42
主题:回复:有一个信息校验的程序没有看明白,有没有大神帮忙分析一下的,谢谢 OPN #DB_Mode_43 //打开DB74 CDB //DB74作为背景数据块DI74打开 L DW#16#85000000 //16#85代表DI,背景数据块的访问 LAR2 //ar2作为访问DI74的地址寄存器 L P##First_Sign //p#db91.dbb430, 指针含6个字节信息,byte0-1代表DBNo=91,byte2代表数据区域类型16#84, byte3-5代表p#430.0 LAR1 L 0 L W [ AR1 , P#0.0 ] //byte0-1,91 ==I JZ M002 T #TEMP10 //temp10=91 OPN DB [ #TEMP10] //打开db91 M002: NOP 0 L D [ AR1 , P#2.0 ] //byte2-byte5, p#84代表指向DB块,本例中DB为91,byte3-5代表P#430.0 LAR1 //AR1存储待检验字符组的首地址 L #Length L 1 <I = #Error JC M001 TAK M003: T #TEMP11 //长度11,每循环减1,直到0 L B [ AR1 , P#0.0 ] //当前待检验字符 T #TEMP14 L DW#16#85000000 LAR2 L 43 //43次循环,查找di74里面是否有匹配的字符 M004: T #TEMP12 L #TEMP14 //当前待检验字符 L B [ AR2 , P#0.0 ] //di74里面的字符 ==I JC M005 +AR2 P#1.0 L #TEMP12 LOOP M004 SET = #Error JU M001 M005: TAR2 //如果匹配,ar2是di74里面匹配字符的指针 L DW#16#FFFFFF //16#00ffffff, 需要抹掉最高位的16#85 AD SRD 3 //指针右移3位,是该字符在DB块的绝对位置 L #TEMP13 //累加位置信息 +D T #TEMP13 +AR1 P#1.0 L #TEMP11 LOOP M003 L #TEMP13 //累加数值,你列举的例子里面累加值为150 L 43 MOD SLD 3 //余数为21,转换成指针p#21.0 L DW#16#85000000 //通过16#85来指向DI,本例子中打开的背景数据块是74 OD LAR2 L B [ AR2 , P#0.0 ] //db74.dbb21是‘L’ T #Checksum |
木头515 侠圣 经验值: 2157 发帖数: 254 精华帖: 0 |
4楼 2021-09-26 07:58:38
主题:回复:有一个信息校验的程序没有看明白,有没有大神帮忙分析一下的,谢谢 透过现场看本质,值得学习。
低头做事,抬头做人!!
|