STM32与宇电设备实现AI-BUS通讯

宇电的设备使用基于RS-485的自定义协议,协议本身比较简单,只有2条指令:

读:地址代号+52H82 +要读的参数代号+0+0+校验码

写:地址代号+43H67+要写的参数代号+写入数低字节+写入数高字节+校验码

校验码采用 16 位求和校验方式,其中读指令的校验码计算方法为:要读参数的代号×256+82+ADDR。

写指令的校验码计算方法为以下公式做 16 位二进制加法计算得出的余数(溢出部分不处理):要写的参数代号×256+67+要写的参数值+ADDR。

返回的数据格式更是固定的,无论是读还是写,仪表都返回以下10个字节数据:测量值 PV+给定值 SV+输出值 MV 及报警状态+所读/写参数值+校验码。

其中 PV、 SV 及所读参数值均各占 2 个字节,代表一个 16 位二进制有符号补码整数,低位字节在前,高位字节在后,整数无法表示小数点,要求用户在上位机处理; MV 占一个字节,按 8 位有符号二进制数格式,数值范围-110~+110,状态位占一个字节,校验码占 2 个字节,共 10 个字节。

而返回的校验码计算则是:PV+SV+(报警状态*256+MV)+参数值+ADDR。清楚协议的这些规则后,编写程序只是顺理成章的事。直接上代码:

/*读取目标设备的参数值*/
void ReadAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,void (*AiBusSendByte)(uint8_t *,uint16_t))
{uint8_t readCommand[INSTRUCTION_LENGTH];uint16_t index=0;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=READ_INSTRUCTION;readCommand[index++]=paraAddr;readCommand[index++]=0x0;readCommand[index++]=0x0;uint16_t checkSum=(uint16_t)paraAddr*256+READ_INSTRUCTION+(uint16_t)deviceAddr;readCommand[index++]=checkSum;readCommand[index++]=(checkSum>>8);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 index=0;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=WRITE_INSTRUCTION;writeCommand[index++]=paraAddr;writeCommand[index++]=data;writeCommand[index++]=(data>>8);uint16_t checkSum=(uint16_t)paraAddr*256+WRITE_INSTRUCTION+(uint16_t)deviceAddr+data;writeCommand[index++]=checkSum;writeCommand[index++]=(checkSum>>8);AiBusSendByte(writeCommand,INSTRUCTION_LENGTH);
}/*解析返回数据,返回值为读或者写的参数值*/
int ParsingReturnData(uint8_t *receiveData,uint16_t *returnData,uint8_t *deviceAddr,uint16_t deviceNum)
{int status=-1;uint16_t pValue=0;uint16_t sValue=0;uint16_t mValue=0;uint16_t alarmStatus=0;uint16_t paraValue=0;uint16_t checkSum=0;pValue=receiveData[0]+receiveData[1]*256;sValue=receiveData[2]+receiveData[3]*256;mValue=(uint16_t)receiveData[4];alarmStatus=(uint16_t)receiveData[5];paraValue=receiveData[6]+receiveData[7]*256;checkSum=receiveData[8]+receiveData[9]*256;uint16_t chk=pValue+sValue+alarmStatus*256+mValue+paraValue;for(int i=0;i<deviceNum;i++){if(checkSum==chk+deviceAddr[i]){status=i;returnData[0]=pValue;returnData[1]=sValue;returnData[2]=mValue;returnData[3]=alarmStatus;returnData[4]=paraValue;break;}}return status;
}

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS如何结束和重新启动调度程序

大多数主机或桌面系统&#xff08;比如Linux&#xff0c;Mac或Windows&#xff09;都有一个正常的用例&#xff0c;你可以在早上启动操作系统&#xff0c;然后在晚上关闭它&#xff0c;然后你就离开机器。嵌入式系统是不同的&#xff1a;他们没有参加&#xff0c;他们应该“永远…

先进过程控制之一:浅说APC

先进过程控制&#xff08;APC&#xff09;技术作为在生产装置级的信息化应用&#xff0c;在优化装置的控制水平和提高生产过程的管理水平的同时&#xff0c;还为企业创造了可观的经济效益。 1、什么是APC 先进过程控制&#xff0c;简称APC&#xff0c;并不是什么新概念。它仅…

STM32与多台MS5803压力传感器I2C通讯

MS5803压力传感器支持SPI和I2C总线通讯&#xff0c;拥有24位AD转换。能够同时获得压力值和温度值&#xff0c;其中压力测量范围为10-1100mbar&#xff0c;温度的测量范围是-40-85摄氏度。各引脚功能及参数如下&#xff1a; 传感器内部结构图如下&#xff1a; 通讯协议的选择通过…

STM32F0使用LL库实现SHT70通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇我们将基于LL库采用模拟I2C接口的方式实现温湿度采集。 1、SHT70简述 SHT70是一款集温湿度…

STM32F0使用LL库实现PWM输出

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本文我们将说明如何通过LL库实现PWM信号的输出。 1、概述 我们知道STM32的TIM计时器可以输出P…

STM32F0使用LL库实现Modbus通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇将说明基于LL实现USART通讯。 1、概述 我们想要实现基于RS485的Modbus通讯实际就是基于US…

STM32基于SPI和AD7192的数据采集

在开发臭氧发生器的时&#xff0c;我们需要一个高分辨率的AD采集&#xff0c;于是选择了AD7192&#xff0c;选择这款ADC的原因比较简单。首先它是24位的符合我们的精度要求&#xff1b;其次它自带时钟&#xff0c;便于节省空间&#xff1b;第三它有4路单端或2路差分输入&#x…

Modbus协议栈实现Modbus RTU多主站支持

前面我们已经详细讲解过Modbus协议栈的开发过程&#xff0c;并且利用协议栈封装了Modbus RTU主站和从站&#xff0c;Modbus TCP服务器与客户端&#xff0c;Modbus ASCII主站与从站应用。但在使用过程中&#xff0c;我们发现一些使用不便和受限的地方&#xff0c;所以我们就想要…

STM32基于AD5663的UV灯电压控制

在开发臭氧发生器的时&#xff0c;我们使用UV灯来实现臭氧的产生。而UV灯的强度决定了臭氧产生的浓度&#xff0c;UV灯的光强则与其控制电压密切相关。所以我们要控制产生的臭氧的浓度就需要调节其控制电压。我们选择了AD5663这一模拟量输出模块来实现这一点。 1、AD5663简介 …

实现Modbus ASCII多主站应用

前面我们已经分析了Modbus RTU的更新设计和具体实现&#xff08;如果不清楚可查看前一篇文章&#xff09;。其实Modbus ASCII与Modbus RTU都是基于串行链路实现的&#xff0c;所以有很多的共同点&#xff0c;基于此&#xff0c;这篇文章我们只讨论与Modbus RTU所不同的部分。 …

STM32一种基于NTC的控温电路及软件实现

NTC&#xff08;Negative Temperature Coefficient&#xff09;是一种随温度上升时&#xff0c;电阻值呈指数关系减小的热敏电阻。应用广泛&#xff0c;最近我们就采用了NTC来控制加热并测温&#xff0c;并达到了预期的效果。 1、硬件设计 我们使用三极管作为加热元件&#x…

STM32利用光敏二极管实现光度测量

最近我们在开发臭氧发生器时&#xff0c;需要监测生成的臭氧的浓度&#xff0c;于是想到使用光度计来测量。因为不同浓度的臭氧对管的吸收作用是不相同的&#xff0c;于是检测光照强度的变化就可以得到相应的浓度数据。 1、硬件设计 此次光照度检测我们选用了S1336-5BQ光电点二…

STM32的ADC通道间干扰的问题

最近我们在开发一个项目时&#xff0c;用到了MCU自带的ADC&#xff0c;在调试过程中发现通道之间村在相互干扰的问题。以前其实也用过好几次&#xff0c;但要求都不高所以没有太关注&#xff0c;此次因为物理量的量程较大&#xff0c;所以看到了变化。 首先来说明一下此次的软…

实现Modbus TCP多网段客户端应用

对于Modbus TCP来说与Modbus RTU和Modbus ASCII有比较大的区别&#xff0c;因为它是运行于以太网链路之上&#xff0c;是运行于TCP/IP协议之上的一种应用层协议。在协议栈的前两个版本中&#xff0c;Modbus TCP作为客户端时也存在一些局限性。我们将对这些不足作一定更新。 1、…

改进初学者的PID-介绍

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-采样时间

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-微分冲击

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

LwIP应用开发笔记之一:LwIP无操作系统基本移植

现在&#xff0c;TCP/IP协议的应用无处不在。随着物联网的火爆&#xff0c;嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中&#xff0c;也都有应用&#xff0c;所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407…

改进初学者的PID-修改整定参数

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-积分饱和

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…