网站开发与维护费用网站多数关键词
news/
2025/10/5 1:05:43/
文章来源:
网站开发与维护费用,网站多数关键词,wordpress学习pdf,百度知道合伙人宇电的设备使用基于RS-485的自定义协议#xff0c;协议本身比较简单#xff0c;只有2条指令#xff1a;
读#xff1a;地址代号52H#xff08;82#xff09; 要读的参数代号00校验码
写#xff1a;地址代号43H#xff08;67#xff09;要写的参数代号写入数低字节写…宇电的设备使用基于RS-485的自定义协议协议本身比较简单只有2条指令
读地址代号52H82 要读的参数代号00校验码
写地址代号43H67要写的参数代号写入数低字节写入数高字节校验码
校验码采用 16 位求和校验方式其中读指令的校验码计算方法为要读参数的代号×25682ADDR。
写指令的校验码计算方法为以下公式做 16 位二进制加法计算得出的余数溢出部分不处理要写的参数代号×25667要写的参数值ADDR。
返回的数据格式更是固定的无论是读还是写仪表都返回以下10个字节数据测量值 PV给定值 SV输出值 MV 及报警状态所读/写参数值校验码。
其中 PV、 SV 及所读参数值均各占 2 个字节代表一个 16 位二进制有符号补码整数低位字节在前高位字节在后整数无法表示小数点要求用户在上位机处理 MV 占一个字节按 8 位有符号二进制数格式数值范围-110~110状态位占一个字节校验码占 2 个字节共 10 个字节。
而返回的校验码计算则是PVSV报警状态*256MV参数值ADDR。清楚协议的这些规则后编写程序只是顺理成章的事。直接上代码
/*读取目标设备的参数值*/
void ReadAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,void (*AiBusSendByte)(uint8_t *,uint16_t))
{uint8_t readCommand[INSTRUCTION_LENGTH];uint16_t index0;readCommand[index]0x80deviceAddr;readCommand[index]0x80deviceAddr;readCommand[index]READ_INSTRUCTION;readCommand[index]paraAddr;readCommand[index]0x0;readCommand[index]0x0;uint16_t checkSum(uint16_t)paraAddr*256READ_INSTRUCTION(uint16_t)deviceAddr;readCommand[index]checkSum;readCommand[index](checkSum8);AiBusSendByte(readCommand,INSTRUCTION_LENGTH);
}/*设置目标设备的参数值*/
void WriteAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,uint16_t data,void (*AiBusSendByte)(uint8_t *,uint16_t))
{uint8_t writeCommand[INSTRUCTION_LENGTH];uint16_t index0;writeCommand[index]0x80deviceAddr;writeCommand[index]0x80deviceAddr;writeCommand[index]WRITE_INSTRUCTION;writeCommand[index]paraAddr;writeCommand[index]data;writeCommand[index](data8);uint16_t checkSum(uint16_t)paraAddr*256WRITE_INSTRUCTION(uint16_t)deviceAddrdata;writeCommand[index]checkSum;writeCommand[index](checkSum8);AiBusSendByte(writeCommand,INSTRUCTION_LENGTH);
}/*解析返回数据,返回值为读或者写的参数值*/
int ParsingReturnData(uint8_t *receiveData,uint16_t *returnData,uint8_t *deviceAddr,uint16_t deviceNum)
{int status-1;uint16_t pValue0;uint16_t sValue0;uint16_t mValue0;uint16_t alarmStatus0;uint16_t paraValue0;uint16_t checkSum0;pValuereceiveData[0]receiveData[1]*256;sValuereceiveData[2]receiveData[3]*256;mValue(uint16_t)receiveData[4];alarmStatus(uint16_t)receiveData[5];paraValuereceiveData[6]receiveData[7]*256;checkSumreceiveData[8]receiveData[9]*256;uint16_t chkpValuesValuealarmStatus*256mValueparaValue;for(int i0;ideviceNum;i){if(checkSumchkdeviceAddr[i]){statusi;returnData[0]pValue;returnData[1]sValue;returnData[2]mValue;returnData[3]alarmStatus;returnData[4]paraValue;break;}}return status;
}
欢迎关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927748.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!