信捷XD3PLC利用C语言求原码的补码

     有的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主程序中一直调用该函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值