TITLE=子程序注释
//CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在***高位(MSB)的位置补零,而***低位(LSB),移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码(16#A001)进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,***个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为***终的CRC值。
// 下面为CRC的计算过程:
// 1.设置CRC寄存器,并给其赋值FFFF(hex)。
// 2.将数据的***个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
// 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
// 4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
// 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
// 6.重复第2至第5步直到所有数据全部处理完成。
// 7.***终CRC寄存器的内容即为CRC值。
//
//输入参数:
//待校验数据区指针,***个字节为数据长度
//LD0DataBuffINDWORD
Network1
LD***0.0
MOVW16#FFFF,AC0//初始化CRC寄存器
BTI*LD0,LW4//数据缓冲区***个字节为数据长度
MOVDLD0,LD6
INCDLD6//指针指向***个待处理字节
Network2
LD***0.0
FORAC2,+1,LW4//开始循环处理每一个字节
Network3
LD***0.0
XORB*LD6,AC0//字节首先与CRC寄存器低位进行异或
Network4
LD***0.0
FORAC1,+1,+8//移位处理循环,处理一个字节的8位
Network5
LD***0.0
SRWAC0,1//CRC寄存器右移一位
Network6
LD***1.1//如果移出位为0,则进入下一次循环
XORW16#A001,AC0//如果移出位为1,CRC寄存器与多项式16#A001异或
Network7
NEXT
Network8
LD***0.0
INCDLD6//指针加1指向下一个字节
Network9
NEXT
Network10
LD***0.0
SWAPAC0//交换CRC寄存器高低字节
MOVWAC S7-300的RLO上升沿检测指令-(P)-的作用是不是会受程序扫描时间影响?
(1)我在FC块里面用到-(P)-,发现程序比较长的时候就出现下图中情况,根本不能用来检测上升沿;
(2)当我把OB1其他的程序都删掉时,只调用这个FC块时,就可以检测上升沿,不会有问题。
(3)另一个是我尝试-(P)-指令要是不在FC块,直接在OB1中,也是不会有问题。
下面是廖常初老师的回帖:P线圈(上升沿检测指令)上面的地址用来保存上一扫描周期的RLO的值,不能使用FB、FC的临时局部变量。改为全局变量或FB的静态变量就可以了。因为调用程序时同一级FB、FC的临时变量公用同一片地址区,前面调用的块的临时变量被后面调用的块的临时变量覆盖,所以上升沿检测指令不能正常运行。在OB1中只调用一个FC,公用的地址区变成该FC独用,所以没有问题。OB1的临时变量的地址区是OB1单独使用的,所以程序放在OB1里也没有问题。0,*LD6//CRC校验值写入数据区结尾