是搞设备网络智能大厦系统的吧!那请我吧。
本人自己设计了一个485协议,自称DCNetBus:
DCNetBus协议
本协议适用于(管理机-隶属从机)通信模式工作的设备控制网络中。在网络中只有(管理机)能主动发送信息,(隶属从机)只能根据(管理机)发送的信息包解包后得到的地址或控制命令决定是否回发信息。
DCNetBus协议通信均采用ASCII(032-126)间的字符, 不能使用其他字符。特殊字符Tab(ASCII码009)为开始字符,特殊字符CR(ASCII码013)为结束字符。一般数据包格式为:
|开始字符|地址域|命令域|数据域|校验域|结束字符|
开始字符:ASCII字符Tab,一个字节。
地址域:十六进制数0x00-0xff,转换ASCII字符为二个字符。
命令域:十六进制数0x00-0xff,转换ASCII字符为二个字符。
数据域:每个字节转换ASCII字符为二个字符。每帧最多十六个字节数据。
校验域:单字节LCR校验,转换ASCII字符为二个字符。
结束字符:ASCII字符CR,一个字节。
域的详细定义
DCNetBus协议中包括四个不同的域,地址域,命令域,数据域,校验域。每个域的详细定义如下:
地址域:地址域为一个字节,十六进制数为0x00-0xff,其0x00为广播地址,管理机在广播通信模式时,从机不回发数据。0x01-0xfe为隶属从机地址, 00xff未用。转换ASCII字符为二个字符。
命令域:命令域为一个字节,十六进制数为0x00-0xff,详细的命令列表见下面,转换ASCII字符为二个字符。从机回发命令,不过在命令字节的最高bit置1。故命令域最多有128条命令(0x00-0x7f)。
数据域:数据域的每个字节均为十六进制数0x00-0xff,每帧最多十六个字节数据,也可以为空(无数据),无数据时整个数据域可以不打包发送。管理机读写从机的一般格式为:输入输出锁存器或输入输出开关的首地址,从机数据块的字节长度计数。从机回复管理机的一般格式为:输入输出锁存器或输入输出开关的数据块数据。详细的数据格式按命令域命令不同而不同。接受无需数据返回的命令如果从机LCR校验正确一般返回“OK!”。每个字节转换ASCII字符为二个字符。故数据每帧最多为三十二个ASCII字符。
校验域:校验域为单字节LCR校验,LCR的计算方法为除开始字符,结束字符外地址域,命令域,数据域的全部数据进行无进位单字节全加。其十六进制数转换ASCII字符为二个字符。如果从机LCR校验出错,从机不回发数据。
数据帧长度
数据帧长度最短为8个ASCII字符,最长为40个ASCII字符。
命令表
十六进制数 命令功能说明了 从机返回
0x00 从机注册 OK!
0x01 测试从机联机 OK!
0x02 读从机模块类型 从机模块类型
0x03 写从机模块连接设备类型 OK!
0x04 读从机模块连接设备类型 连接设备类型
0x05 屏蔽该从机模块 OK!
0x06 激活该从机模块 OK!
0x07 屏蔽、激活模块连接设备 OK!
0x08 测试模块连接设备屏蔽口 连接设备屏蔽口状态
0x09 请求从机发送数据 数据
0x0A 读输入锁存开关 输入锁存开关状态
0x0B 读输出锁存开关 输出锁存开关状态
0x0C 写输出开关 OK!
0x0D 读输入锁存器 输入锁存器数据
0x0E 读输出锁存器 输出锁存器数据
0x0F 写输出锁存器 OK!
0x10 写同类输出设备 无
命令说明
从机注册命令:(|Tab|0x00|0x00|0x01-0xfe|LCR|CR|)
从机注册命令仅在主机广播时发送,主机广播地址为0x00,命令为0x00,数据域内为一字节抢注地址(0x01-0xfe),当未注册从机接收到此命令时进行抢注,如果某一从机抢注成功,返回给主机一信息OK!。如果无从机抢注成功则不返回任何信息。主机为周期性发送从机注册命令,主机先查询注册表,逐个请求已注册从机发送数据,待查询处理完所有注册从机后发送一次从机注册命令。这样可以随时使新接入网络的模块自动完成注册。抢注成功从机返回格式为:
|Tab|0x01-0xfe|0x80|OK!|LCR|CR|
测试从机联机:(|Tab|0x01-0xfe|0x01|LCR|CR|)
对已注册从机主机可发该命令进行联机测试,如果从机联机正常返还OK!表示联机正常,从机联机不正常,不返还任何信息。从机联机正常返还格式为:
|Tab|0x01-0xfe|0x81|OK!|LCR|CR|
读从机模块类型:(|Tab|0x01-0xfe|0x02|LCR|CR|)
对已注册从机主机可发该命令进行联机模块类型测试,如果从机联机正常返还该模块类型号,DCNetBus协议提供256种模块类型号,见下面模块类型号列表。如果从机是输入或输出开关类模块,在返还模块类型号的后面紧跟输入或输出端口数量,输入或输出端口数量为(0-F)用ASCII字符表示。从机返还一般格式为:非输入或输出开关类模块返还无|0x0-0xf|端口数量项。
|Tab|0x01-0xfe|0x82|0x00-0xff|0x0-0xf|LCR|CR|
写从机模块连接设备类型:(|Tab|0x01-0xfe|0x03|link-define|LCR|CR|)
此命令仅用于对多路输入或输出开关模块连接设备的定义。单项功能模块不使用该命令。按bit位(低位在先)bit0-bit7,bit8-bit15次序排列。DCNetBus协议提供255种设备类型号,见下面设备类型号列表,
例:定义一8路输出开关模块,其中bit0-bit3接有设备, bit4-bit7未接设备,定义bit0接普通电灯,bit1接普通电灯,bit2接荧光灯,bit3接换气扇,未接设备bit补0x00,主机写从机模块连接设备类型命令为:
|Tab|0x01-0xfe|0x03|0x01 0x01 0x02 0x04 0x00 0x00 0x00 0x00|LCR|CR|
如果定义成功,从机返回|Tab|0x01-0xfe|0x83|OK!|LCR|CR|。
读从机模块连接设备类型: (|Tab|0x01-0xfe|0x04|LCR|CR|)
此命令仅用于对已定义的多路输入或输出开关模块连接设备的读。单项功能模块不使用该命令。主机发送此命令后,如果从机成功接收,从机返回模块已连接设备类型。定义一8路输出开关模块(已定义一8路输出开关模块为例):
|Tab|0x01-0xfe|0x84|0x01 0x01 0x02 0x04 0x00 0x00 0x00 0x00|LCR|CR|
如果从机未定义连接设备,从机返回全0x00如下:
|Tab|0x01-0xfe|0x84|0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00|LCR|CR|
屏蔽该从机模块:(|Tab|0x01-0xfe|0x05|LCR|CR|)
从机模块正确接收到此命令时返回|Tab|0x01-0xfe|0x85|OK!|LCR|CR|,
屏蔽后的从机模块,不向主机发送任何信息,除非从机重新接收到激活命令。
激活该从机模块:(|Tab|0x01-0xfe|0x06|LCR|CR|)
从机模块正确接收到此命令时返回|Tab|0x01-0xfe|0x86|OK!|LCR|CR|,
从机重新激活。
屏蔽、激活模块连接设备:(|Tab|0x01-0xfe|0x07|activ-define|LCR|CR|)
此命令仅用于对多路输入或输出开关模块连接设备的定义。单项功能模块不使用该命令。按bit位(低位在先)bit0-bit7,bit8-bit15次序排列。bit 位0x0表示屏蔽,0x1表示激活。
例:对一8路输出开关模块某几个连接设备进行屏蔽,主机发送格式为:
|Tab|0x01-0xfe|0x07|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
以上命令表示bit2,bit3被激活,其余bit被屏蔽。从机模块正确接收到此命令时返回|Tab|0x01-0xfe|0x87|OK!|LCR|CR|,
测试模块连接设备屏蔽口: (|Tab|0x01-0xfe|0x08|LCR|CR|)
从机模块正确接收到此命令时返回连接设备端口屏蔽、激活状态。其返回格式为(已定义一8路输出开关模块为例):
|Tab|0x01-0xfe|0x88|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
请求从机发送数据:(|Tab|0x01-0xfe|0x09|LCR|CR|)
主机发此命令接受从机回送数据,如果从机无回发数据,从机返回PASS,其格式为:
|Tab|0x01-0xfe|0x89|PASS|LCR|CR|。
如果从机有回发数据,是开关类模块返回格式为(已定义一8路输出开关模块为例):
|Tab|0x01-0xfe|0x89|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
其中0x0表示关,0x1表示开,端口排列次序为从bit0-bit7。
如果从机有回发数据,是寄存器类模块返回格式为:
|Tab|0x01-0xfe|0x89|0xXX 0xXX 0xXX … 0xXX|LCR|CR|
其中数据域中的数据长度最长不超过16个字节,即32个ASCII字符。
读输入锁存开关:(|Tab|0x01-0xfe|0x0A|LCR|CR|)
主机发此命令强制从机回送数据,从机即返回输入锁存开关状态。其返回格式为:
|Tab|0x01-0xfe|0x8A|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
其中0x0表示关,0x1表示开,输入端口排列次序为从bit0-bit7-bit15。
读输出锁存开关:(|Tab|0x01-0xfe|0x0B|LCR|CR|)
主机发此命令强制从机回送数据,从机即返回输出锁存开关状态。其返回格式为:
|Tab|0x01-0xfe|0x8B|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
其中0x0表示关,0x1表示开,输出端口排列次序为从bit0-bit7-bit15。
写输出锁存开关:(|Tab|0x01-0xfe|0x0C|port-define|LCR|CR|)
主机发此命令强制写入数据到从机,其格式为:
|Tab|0x01-0xfe|0x8C|0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x0|LCR|CR|
其中0x0表示关,0x1表示开,输出端口排列次序为从bit0-bit7-bit15。如果从机写入正确,回发|Tab|0x01-0xfe|0x8C|OK!|LCR|CR|,
读输入锁存器: (|Tab|0x01-0xfe|0x0D|LCR|CR|)
主机发此命令强制从机回送数据,读输入锁存器类模块返回格式为:
|Tab|0x01-0xfe|0x8D|0xXX 0xXX 0xXX … 0xXX|LCR|CR|
其中数据域中的数据长度最长不超过16个字节,即32个ASCII字符。
读输出锁存器: (|Tab|0x01-0xfe|0x0E|LCR|CR|)
主机发此命令强制从机回送数据,读输出锁存器类模块返回格式为:
|Tab|0x01-0xfe|0x8E|0xXX 0xXX 0xXX … 0xXX|LCR|CR|
其中数据域中的数据长度最长不超过16个字节,即32个ASCII字符。
写输出锁存器: (|Tab|0x01-0xfe|0x0F|data-block|LCR|CR|)
主机发此命令写数据到从机,如果从机写输出锁存器成功,写输出锁存器类模块返回格式为:
|Tab|0x01-0xfe|0x8F|OK!|LCR|CR|
其中数据域中的数据长度最长不超过16个字节,即32个ASCII字符。
写同类输出设备:(|Tab|0x00|0x10|class-name|0/1|LCR|CR|)
此命令是在广播方式时发送,所有同类设备接收到此命令后执行。单不返回任何信息。其中class-name为设备类型名,后跟0表示关,1表示开。此命令仅仅对开关类模块有效。
未完。
发表时间:2003年7月28日20:56:06