新闻中心

EEPW首页>嵌入式系统>设计应用> 基于CAN-bus 总线的模拟空调温/湿度控制系统

基于CAN-bus 总线的模拟空调温/湿度控制系统

作者: 时间:2012-07-11 来源:网络 收藏

‘转换Out_SendID到字符型
ifOut_SendID=255then
Out_SendID=Out_SendID+1
else
Out_SendID=0
endif
Out_CANData1=!I2Hex(Out_SendID)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData1
‘转换Out_Extern和Out_Remote到字符型
Out_CANData1=!I2Hex(Out_Extern)+!I2Hex(Out_Remote)
Out_CANData2=Out_CANData2+Out_CANData1
‘转换Out_ID到字符型
Out_CANData1=!I2Hex(Out_ID)
Lenght=!Len(Out_CANData1)
whileLenght8
Out_CANData1="0"+Out_CANData1
Lenght=!Len(Out_CANData1)
endwhile
Out_CANData2=Out_CANData2+Out_CANData1
‘转换Out_DataLen到字符型
Out_CANData1=!I2Hex(Out_DataLen)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
‘转换Out_Data07到字符型
Out_CANData1=!I2Hex(Out_Data0)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data1)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data2)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data3)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data4)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data5)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data6)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1
Out_CANData1=!I2Hex(Out_Data7)
if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
Out_CANData2=Out_CANData2+Out_CANData1

这样,以后要将In_CANData的数据提取到In_*变量中,只需在脚本中按!setstgy(StringToObject)就可以了。而要将Out_*数据合并到Out_CANData,可先调用!setstgy(ObjectToString),然后再把Out_CANData2的值赋给Out_CANData。

四、协议及报文格式

因为MCGS不便于编写复杂的脚本程序,所以传输协议的设计以简单为原则。本系统使用HiLon协议A。HiLon协议A是一个通用的协议,基于非对称型主从式网络结构,支持广播和点对点传送命令数据,命令数据包可长达256字节,非常适合用作本系统的通信协议HiLon协议以CAN2.0A帧结构为基础。下图是帧报文格式,一个CAN2.0A标准帧由11位ID、1位RTR、4位DLC、数据区(最多8个字节)组成。

HiLonA报文格式
图4HiLonA报文格式

DIR:方向位。方向位决定一半的优先级而剩余的优先级,由节点地址决定低地址优先级高。当方向位为“1”时,地址域是源节点地址(从节点到主节点),优先级由地址决定;当方向位为“0”时,地址域是目标节点地址(主节点到从节点),优先级由地址决定。从节点也可使用地址滤波技术从而减少需处理的网络信息量,因而能有效节省CAN节点控制器资源,提高控制器效率。

Address:目标地址,表示节点地址,范围只能设定为0~125
TYPE:帧类型。见下表中的帧类型说明。

表2HiLon帧类型
HiLon帧类型

DLC:每帧字节数(1~8)
Index:索引字节。对于单帧数据,该字节表示传输数据的第一个字节;对于多帧数据,此字节表示索引字节,即此帧数据在数据包中的位置。
Data:数据

在本系统中,数据中心要对各个房间的温/湿度进行监控并修各个房间的温/湿度SV值,因此给各个控制室分配唯一的标志符;在下位机向上位机发送的数据报文中携带的数据是房间的温/湿度值;上位机向下位机发送的命令报文携带命令号及控制室的温/湿度SV值。本系统的传输数据量较小,且MCGS的采样周期本系统取5ms相对下位机来说较长,因此,本系统选择使用单帧(点对点)类型帧。利用HiLon报文的特点,将7位Address分配给房间ID,每一个房间ID对应一个Address,地址0保留。当数据方向是从节点到主节点时,8字节数据的前4字节用于传递房间温度,后4字节用于传递房间湿度,当数据方向是主节点到从节点时,8字节数据的前4字节作为命令ID,后4字节用于传递命令参数(房间温/湿度SV值)。报文帧的格式如图1所示。

报文帧格式
图5报文帧格式

对主节点到从节点的命令ID的定义如下:

表3控制命令类型及其参数
控制命令类型及其参数

本系统要监控的数据是各房间的温度和湿度及它们的SV值。要将这些数据在总线上传输,必须将它们装入报文帧。为了使传输的数据只占用较小的空间而达到较高的精确度,在报文中每一种数值都分配了4字节的空间,数据按IEEE-754标准的float数据类型的格式存储。这样,在下位机进行编程就比较方便。但是,上位机的处理程序是用类似VB脚本的语言写的,数据对象的类型只有数值型、开关型和字符型三种,不能直接使用接收到的数据。因此,要对接收到的数据进行转换。

按IEEE-754标准,一个浮点数用两个部分表示:尾数和2的幂。例如:

尾数代表浮点上的数据二进制数。

二的幂代表指数。指数的保存形式是一个0到255的8位值。指数的实际值是保存值0到255减去127,一个范围在127到-128之间的值。

尾数是一个24位值(代表大约7个十进制数),最高位(MSB)通常是1,因此,不保存。一个符号位表示浮点数是正或负。在尾数的左边有一个省略的二进制点和1。这个数在浮点数的保存中经常省略。

浮点数保存的字节格式如下:

IEEE-754标准float存储格式
图6IEEE-754标准float存储格式

这里:
S代表符号位,1是负,0是正。
E幂,偏移127。
M24位的尾数(保存在23位中)。
零是一个特定值,表示幂是0,尾数是0。

在运行策略中新建一个名为SplitFloat的用户策略,新增一策略行并添加以下脚本程序,用于将数值型对象float转换到4字节存储单元Byte0Byte3:

‘计算浮点数的幂(二进制数小数点的位置)
exponent=0
float1=!abs(float)
whilefloat1>0
float1=!BitRShift(float1,1)
exponent=exponent+1
endwhile
exponent=exponent-1
‘计算浮点数的底数
mantissa=!abs(float)*(!BitLShift(2,23-(exponent+1)))-8388608
exponent=exponent+127
Byte0=!BitRShift(exponent,1)
ifroom1tempsv0then
Byte0=!BitOr(Byte0,128)
endif
Byte1=!BitAnd(!BitOr(!BitRShift(mantissa,16),!BitLShift(exponent,7)),255)
Byte2=!BitAnd(!BitRShift(mantissa,8),255)
Byte3=!BitAnd(mantissa,255)



评论


相关推荐

技术专区

关闭