有的modbus设备数据格式是采用原码来表示,而PLC负数是以补码表示的,所以经过转换才能正确显示其数值,
1.原码-正数,其补码为原码。
例:原码-正数:2进制表示:0000 0000 0011 0000 表示数值为48,其补码与原码相同
2.原码-负数,其补码为符号位不变,数值位分别“按位取反”,再加1.
例:原码-负数:2进制表示:1000 0000 0011 0000 表示数值为-48 ,
补码表示:1111 1111 1101 0000 表示数值为-48
3.转换的C语言程序代码如下
先判定待处理数据是正数还是负数,本程序选择的是根据符号位是为1或0经过与算来判定是正数还是负数。
/*************************************************************************
* FunctionBlockName: YMTOBM
* Version: 1.0.0
* Author:
* UpdateTime: 2024-11-05 20:42:54
* Comment: 原码转补码
**************************************************************************/
/**
* @summary
* @param W
* @param B
*/
void YMTOBM(PINT16S W,PBIT B)
{
//D340,D341,D342 为采集的原始数据,数据格式是原码表示,
//D0,D1,D2 为原码转换后的数值
#define SysRegAddr_HD_D_HM_M
int i;
for ( i = 0; i < 3; i++ )
{
if ( ( D[340 + i] & 0X8000 ) == 0x8000 ) //若为负数
{
D[0 + i] = 1 + ( ~ D[340+i] ) | 0X8000 ;
}
else //为正数
{
D[0 + i] = D[340 + i];
}
}
}
4.,在PLC主程序中一直调用该函数。