报文包含若干信号,信号的格式(Byte order)可以是两种之一: Motorola或者Intel。他们是指Motorola和Intel处理器中使用的数据的储存格式,也就是两种字节序,Motorola是大端字节序,Intel是小端字节序。
大端模式:是指对于多字节数据的MSB(最高有效字节)保存在内存的低地址中,而数据的LSB(最低有效字节)保存在内存的高地址中。
小端模式:是指对于多字节数据的MSB(最高有效字节)保存在内存的高地址中,而数据的LSB(最低有效字节)保存在内存的低地址中。
例如一个值为0x7788的16bit的WORD型变量x, 存放在0x0010开始存储器地址中。对于大端模式,就是将0x77放在低地址中,即0x0010中,0x88放在高地址中,即0x0011中。小端格式,刚好相反。
//CONVERT AND COPY CONTROL WORD TO BUFFER
//The SINAMICS and the SIMATIC uses different Byte orders (Endianness)
//The SINAMICS use Intel format or Little-Endian while the SIMATIC uses Motorola format or Big-Endian.
//The control and status words we change the high AND low bytes
//大端左移位(ROL)改为小端
#tempOutDataWord[1] := ROL(IN := #statControlWord, N := 8);
西门子S7-300、S7-400 和 S7-1200/1500 是大端序(Big-Endian),S7-1200/1500 标准块为大端序,优化的块为小端序(Little-Endian)。
“西门子352报文”在SIMATICS G120控制单元中使用的是Intel小端序,而在PLC SIMATIC S7-1500中标准数据块(非优化块)使用的是大端序。这时,大端控制报文需要使用ROL命令转换成小端控制报文(ROR命令亦可)。“西门子352”控制报文示例如下(报文格式详见第54节“变频器的 PROFIBUS DP 通讯”中的报文格式):
G120控制单元和S7-1500 PLC报文中的速度、电流、扭矩等不需要大小端转换。以转速为例:
//CONVERT SETPOINT VALUE AND COPY TO BUFFER
//The speed value is transferred as scaled value.
//The reference speed for the scaling is stored in P2000 in a SINAMICS G120, which is about 1482rpm.
//The scaling is: 100%(of P2000)=4000hex=16384dez
#actualSpeed:=1482*(INT_TO_REAL(WORD_TO_INT(#tempInDataWord[2]))/ 16384.0);
#tempOutDataWord[2]:=INT_TO_WORD(REAL_TO_INT(#speedSetpoint/1482*16384.0);
这里G120变频器返回的速度、电流和扭矩:#tempInDataWord[2]、#tempInDataWord[3]、#tempInDataWord[4]是Word类型,大端格式,高字节在低位存储,低字节在高位存储。设置数据类型也可以为INT,PLC直接读取。如果返回值是16384,即0x4000,则:
tempInDataWord[2] 存储区: 0x00(高位),0x40(低位)
如下图所示,TempwordByte[0](16#00)和TempwordByte[1] (16#ff)分别为TempWord的低存储位和高存储位,从WORD转换为INT,无论是直接赋值还是使用WORD_TO_INT命令,都是高低存储位互换后转换成整数,即:高字节为16#00,低字节为16#ff。给WORD变量赋值时(16#ff00,16#ff是高字节,16#00是低字节),16#ff存储在低位,16#00存储在高位。在WORD和INT的书写时,高字节在前,低字节在后,但是在存储时,高字节在后(低存储位),低字节在前(高存储位)。!!高低字节顺序在存储或读取过程中发生转换!!
上述示例中是优化的DB数据块,是小端序,而程序所在的OB1块是非优化块,所有的变量都是大端序。
博图编程中获取变量bit位的方法:#<variable>.%X0 (bit=0)