如何用PLC监听消防系统485总线通讯获取火灾报警数据

本文由艺捷自动化编写,艺捷自动化旗下产品有艺捷自动化网站和易为二维码说明书小程序(微信)

前言,先来说一下为什么会有这么一个奇怪的应用。在一个自动化系统改造升级项目中,甲方要求把消防的画面加到他们的后台上。他们的后台用的亚控的KingSCADA组态软件。但是把消防的数据做到后台电脑上何其难也,因为这是一个跨行业的应用了,人家消防有消防的一套通讯系统,跟你工控自动化是不兼容的。我研究消防系统485总线通讯协议,确定了用西门子200 SMART PLC来监听消防系统485总线的方案。所能获取的数据也很有限,只能获取实时发生的火灾信息。具体来说,当消防主机的485总线上接有火灾显示盘的时候,有火灾报警的时候,消防主机会向火灾显示盘发送火灾报警信息,这时候PLC监听到这一部分数据,提取出来,最后反馈到后台电脑上。要搞懂这些程序要有熟练的西门子200 SMART编程技术。也许您也碰到了这样奇葩的要求,这些资料就有很大的参考价值。下面就具体讲解一下实现的步骤,并提供所有资料和完整的PLC程序。

首先,先讲一下接线吧。首先来看消防主机的485通讯接线:

看到485显示盘A/B端子了吗,这上面的两根线是485通讯线,接到火灾显示盘上。再来看看火灾显示盘的接线:

看到了吗,这就是火灾显示盘,本来这个是要装在走廊上的,我们只用它的通讯功能,所以就放到柜子里了。这个火灾显示盘是要根据消防主机的型号,来配套的,要联系消防厂家,看看配哪个型号的火灾显示盘。看到那两根并排的红线和两根蓝线了吗,就是485通讯线,一端去消防主机,一端去PLC的通讯。再来看看PLC那边的接线吧:

看到PLC上的SB COM01扩展板了吗,那上面接的红线和蓝线,就是从火灾显示盘过来的485通讯线。这样就构建了一个485通讯总线,接线完毕。下面来讲一下消防系统的485总线通讯协议吧。

那么,现在开始讲485总线通讯协议。这份通讯协议是公司花了大价钱从消防厂家买来的,由于人家说是绝密文档,我没法给大家发布出来。但是为了讲清楚后面的程序,则必须要讲这个协议要用的部分内容。我把所有要用到的协议内容,一次性的在这里讲出来,后面看程序的时候,可以返回来仔细看。这个协议是一个消防系统485总线通讯协议,适用于其9000消防系统。我不清楚各个消防厂家的协议是不是一样的,假设你要做类似的监听通讯,则必须要从消防厂家那里获得其通讯协议,没有协议一切白费。下面就是协议的部分内容。

概述,在我做的这个系统里,火灾报警控制器做为主机,火灾显示盘做为从机。而PLC呢,只是一个监听者。

物理链路协议,起始位1位,数据位8位,校验位1位偶校验,停止位1位,波特率9600.

数据包传输协议。在数据包传输协议中,需要使用几个特征字符,用于包的完整传输,具体如下:SYN(0XAA)同步字符,连续两个以上的同步字符,认为是一个数据包开始;EOT(0XAF)结束字符,出现结束字符认为数据包数据结束;DLE(0XA0)转义字符,当数据中出现同步字符,结束字符和转移字符时,为了让这些字符做为普通数据处理,就在前面加一个转义字符。我后面的程序中还真用到了转移字符,是在处理中文的报警地址的时候用到的。

连接层传输协议必须遵循以下通讯机制:

1. 对于发送方的每一个数据包,接收方根据接收的数据必须向发送方发送响应数据包(接收确认或接收非确认)。

2. 对于多包数据传输,其数据发送有效包号从1开始。数据包号为0的ACK将触发实际多包数据的发送传输过程。发送PKG_NO号SOH包数据,接收方响应PKG_NO号ACK,发送方收到PKG_NO号ACK,发送方发送PKG_NO+1号包数据。

3. 当接收方检测到数据出错时,向发送方发送非确认NAK数据包。

4. 发送方发送完一个数据包后,在20ms 后没有收到接收方的确认或非确认信号,重发此数据包,重发次数为3。

5. 为了启动数据发送过程,发送方首先发送ENQ 数据包,等待接收发方发送PGK_NO=0的ACK 确认包,发送方在收到PKG_NO=0的ACK 确认包后,进入SOH数据包发送状态。

下表为连接层所用特征字符以及相应的通讯帧格式。

通讯帧含义

特征字符

通讯帧格式

数据

0xE0 (SOH)

SOH

SRCADDR

DESTADDR

PKG_NO

LEN

TYPE

DATA

广播数据

0xBB (BCSOH)

BCSOH

SRCADDR =0

DESTADDR =0

CMD_NO

DATA

退出

0xE1 (EXT)

EXT

SRCADDR

DESTADDR

接收确认

0xE2 (ACK)

ACK

SRCADDR

DESTADDR

PKG_NO

接收非确认

0xE4 (NAK)

NAK

SRCADDR

DESTADDR

结束

0xE8 (NUL)

NUL

SRCADDR

DESTADDR

结束确认

0xE9 (NULACK)

NULACK

SRCADDR

DESTADDR

查询

0xE7 (ENQ)

ENQ

SRCADDR

DESTADDR

握手

0xD0 (SAK)

SAK

SRCADDR

DESTADDR

握手确认

0xDF (SAKED)

SAKED

SRCADDR

DESTADDR

TYPE

连接

0xF1 (LINK)

LINK

SRCADDR

DESTADDR

连接确认

0xF4 (LINKED)

LINKED

SRCADDR

DESTADDR

终止连接

0xF2 (UNLINK)

UNLINK

SRCADDR

DESTADDR

终止连接确认

0xF8 (UNLINKED)

UNLINKED

SRCADDR

DESTADDR

大家看到了吗,主机和从机之间的通讯要经过一套发送,应答机制。

连接层通讯状态描述,地址:主机地址为00,从机地址为1-99.

握手信号和从机在线检测机制,当主机向从机发送握手数据包后,在规定的时间间隔内没有收到从机的应答信号就认为此次连接失败,不再进行重发,直接对下一个从机发送握手信号。

应用数据的传输,应用数据的传输需要依靠SOH和BCSOH通讯帧来完成。BCSOH用于广播、复位和消声等系统消息。SOH用于传输火警/反馈信息,配置信息等实际数据。

握手和握手确认,报警主机为了判断火灾显示盘和火灾显示盘扩容箱否在线,通讯是否畅通。报警主机会向从机轮询逐个握手,从机收到本地址的握手命令后,在40ms内向主机发送握手确认命令,否则报警主机会报该地址从机通讯故障。后面的程序中,以前用到过这个数据,后来不用了,用处不大。

【实例说明】

主机发送握手命令:AA AA AA AA D0 00 1E AF CE

从机响应握手确认:AA AA AA AA DF 1E 00 TYPE AF C1

握手命令解析

编号

数据

说明

备注

AA AA AA AA

同步字符

D0 握手命令/DF 握手确认

D0

特征字符

00

发送源地址

报警主机地址号00,例子中从机为0x1E 即30。

1E

发送目的地址

AF

结束字符

CE

数据校验

校验和

广播命令,广播命令有三条:复位命令、消音命令和时间同步命令。从机收到广播命令后不用向主机发送应答数据。复位命令:控制器复位时,控制器在485 总线上发送复位命令。消音命令:控制器进入本机消音状态,向485 从机设备发送消音命令。时间同步:控制器每10分钟向从机广播时间数据。后面的程序用到了这部分内容,具体是用到了广播时间同步命令。

【实例说明】

主机发送广播复位命令:AA AA AA AA BB 00 00 00 AF BB

主机发送广播消音命令:AA AA AA AA BB 00 00 01 AF BA

主机发送广播时间同步命令:AA AA AA AA BB 00 00 0E 11 01 25 15 02 13 AF 84

广播命令解析

编号

数据

说明

备注

AA AA AA AA

同步字符

BB

特征字符

广播命令

00

发送源地址

00

发送目的地址

广播命令目的地址为00

00

数据类型

00 复位/01 消音/0E 时间同步

11 01 25 15 02 13

时间数据11 年01 月25 日15 时02 分13 秒

日期和时间数据为BCD 码;复位和消音命令时,位置⑥无时间数据。

AF

结束字符

84

数据校验

火警等信息传输流程,主机向从机下发一条火警信息,需要连续发送7帧数据(配置列别发送最多需要20帧,其它类型信息传递一般小于7帧),从机需要对每帧数据应答,共14帧数据。

火警信息传输实例说明:

步骤1)主—>从(主机向从机发送连接命令):AA AA AA AA F1 00 1E AF EF 。

步骤2)从—>主(从机发给主机发送连接确认命令): AA AA AA AA F4 1E 00 00 AF EA 。

步骤3)主—>从(主机向从机发送查询命令):AA AA AA AA E7 00 1E AF F9 。

步骤4)从—>主(从机发给主机接收确认命令):AA AA AA AA E2 1E 00 00 AF FC

步骤5)主—>从(主机向从机发送第一包火警数据):

AA AA AA AA E0 00 1E 01 23 20 02 01 01 00 39 39 0B 01 01 01 39 30 31 C7 F8 30 31 B2 E3 30 35 37 BA C5 00 00 00 00 00 00 00 00 00 00 00 AF EF 。

第1包火警数据解析(这里是后面程序要用的,只不过实际的数据比这个多,第1包数据扩大到年月日数据处):

编号

数据

说明

备注

AA AA AA AA

同步字符

E0

特征字符

0xE0 发送数据

00

发送源地址

1E

发送目的地址

01

包号

0x01 第一包数据 0x02 第二包数据

23

数据长度

0x23 即35 个字节

20

数据类型

0x20 火警或反馈

0x40 故障

0x24 模块的启动或停止

0x50 主机状态

02

主类型

0x02 火警和反馈数据

0x05 故障数据

0x04 启动或停止

01

从类型

0x01 火警<反馈>发生

0x81 火警<反馈>消失

详细参考《系统SOH 命令号列表》

01

主机号

11

00

接口板和回路号

0x00 表示第一个回路

12

39

设备地址号

回路中0x39 号地址报火警扩展到2 字节

13

39

设备的生产类型

14

0B

设备类型

15

01

区号

16

01

栋号

17

01

层号

18

39

房号

19

位置描述

20

AF

结束字符

21

EF

数据校验

步骤6)从—>主(从机发给主机接收确认命令):AA AA AA AA E2 1E 00 01 AF FD 。

步骤7)主—>从(主机向从机发送第二包火警数据):AA AA AA AA E0 00 1E 02 23 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 01 25 15 02 00 00 CA D6 B1 A8 00 00 00 00 00 00 AF D8 。

第2包数据解析(这是后面程序要用到的,实际数据比这个少,只有时分秒及后面的数据):

编号

数据

说明

备注

AA AA AA AA

同步字符

E0

特征字符

0xE0 发送数据

00

发送源地址

1E

发送目的地址

02

包号

0x01 第一包数据

0x02 第二包数据

23

数据长度

0x23 即35 个字节

20

数据类型

位置信息描述

11

01

11

25

12

15

13

02

14

00

15

00

隔离标志

16

设备类型描述

17

AF

结束字符

18

D8

数据校验

步骤8)从—>主(从机对第二包数据的应答):AA AA AA AA E2 1E 00 02 AF FE。

步骤9)主—>从(主机发送数据传输结束命令):AA AA AA AA E8 00 1E AF F6。

步骤10)从—>主(从机应答结束确认):AA AA AA AA E9 1E 00 00 AF F7。

步骤11)主—>从(主机发送接收确认):AA AA AA AA E2 00 1E AF FC。

步骤12)从—>主(从机发送退出):AA AA AA AA E1 1E 00 00 AF FF。

步骤13)主—>从(主机发送终止连接):AA AA AA AA F2 00 1E AF EC。

步骤14)从—>主(从机应答终止连接确认):AA AA AA AA F8 1E 00 00 AF E6。

有效数据详细描述,火警或反馈信息有效数据详细描述(把2个火警数据包的数据合起来就能得到这个数据,后面的程序用到了这里的资料)

命令号

字段域

字段含义描述

含义描述

0x20

ucLength

1

长度(71)

火警或反馈

下同

ucStruMasterType

1

主类型(0x02)

下同

ucStruSlaverType

1

从类型(0x01:火警<反馈>发生0x81:火警<反馈>消失)

ucHostNO

1

主机号(从1 开始)

ucIOB_LoopNO

1

接口板和回路号(=(IOBNO-1)*2+LOOPNO)

ucAddrNO

2

设备地址号(高字节为地址的低位,低字节为地址的高位)

ucMakeType

1

生产类型

ucEquipmentType

1

设备类型(用于联动,详细描述见后)

ucZoneNO

1

区号(从0 开始0-19)

ucBuildingNO

1

栋号(从0 开始0-19)

ucFloorNO

1

层号(0-199 为1-200 层)(0xFF-0xF6 为-1 至-10 层)

ucRoomNO

1

房号(0-255)

aucPlaceDesc

41

位置描述,长度为41,以0 结尾的字符串

ucYear

1

年(两位BCD 码)

ucMonth

1

月(两位BCD 码)

cDay

1

日(两位BCD 码)

ucHour

1

时(两位BCD 码)

ucMinute

1

分(两位BCD 码)

ucSecond

1

秒(两位BCD 码)

ucIsolateFlag

1

隔离标志(0:未隔离,1 隔离)

aucEqpDesc

11

设备类型描述,长度为11,以0 结尾的字符串

怎么样,这个协议啰嗦吗。后面还有各种数据详细描述和有关火灾显示盘扩容箱的通讯协议,由于后面的程序没有用到,就不罗列出来了。通讯协议的讲解就到此为止。

看到协议的内容估计大家头都大了吧。没事下面我会结合实际的程序给大家分解开,一步步讲解。要搞懂这个程序大家一定要投入一些时间,踏踏实实把程序看完。程序可能比较多,我没法一一在这里展示出来。我也不可能把每一条指令的作用给大家讲清楚,我只能说说这一段的程序执行的是什么功能。程序的基本逻辑就是监听485通讯线上的通讯帧,分析这些数据,获取对我们有用的数据。我打算按照程序的实际工作流程来讲解,而不是按照程序段的顺序来讲解,这样大家更容易理解。前面的指令我可能讲的仔细点,后面就讲主要的功能和特别需要注意的地方,因为内容实在太多,大家也不希望我长篇大论。

首先,在主程序中调用消防通讯子程序。

消防通讯子程序第1段:

这一段程序的功能是设置自由口通讯参数,连接中断处理程序,数据区清零,打开接收指令。SMB130设置为16#49的意思是,偶校验,每个字符8位,波特率9600,自由端口模式。SMB187设置为16#94的意思是,启用接收消息功能,忽略起始字符,忽略结束字符,使用空闲线,字符间定时器,使用定时器超时,忽略断开条件。SMW190设置为2意思是,空闲线时间2ms。设置SMW192为2意思是,定时器超时值2ms,由于主从机之间帧响应太快,所以减少时间为2ms.虽然设置的这么短,但还是可能会漏掉火警数据的第二个包。SMB194设置接收最大字符数99。将端口1接收消息完成(24)事件连接到中断处理24子程序上。开中断。中断计数为0。这个变量用来检测是否成功进入了中断处理程序。对接收区清零。启动第1次接收指令。

中断处理24子程序第5段和第8段:

首先来讲一个问题,由于消防主机和火灾显示盘之间的数据帧交互太快,火警数据需要由两个数据帧来完成,第2个火警数据帧有时会抓取不到。我这里使用了各种方法来缩短中断处理程序的时间,但效果不明显。即使用了跳转指令,也不能完全抓取第2包,10次里有1-2次抓不到。第5段程序,接收到确认命令后跳转。为什么这里要跳转呢,因为16#E2是接收确认的意思,是火灾显示盘发给消防主机的应答信息,对我们没用。我们只截取消防主机发给火灾显示盘的信息,所以为了减少中断处理时间,我们直接跳转,越过下面的程序段。虽然我采用了这种技巧,但是效果并不明显,还是前面说的有时候第2个火警数据包会抓取不到。后面我采用了,伪造第2个火警数据包的方法,到了那个地方我还会讲。第8段,就是跳转的标签,如果条件成立就跳转到这里,越过第6段和第7段。

如何用PLC监听消防系统485总线通讯获取火灾报警数据_艺捷自动化

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

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

相关文章

C++哪些函数不能被声明为虚函数

在C中&#xff0c;某些函数不能被声明为虚函数。下面详细解释哪些函数不能被声明为虚函数&#xff0c;并通过代码示例进行说明。 C哪些函数不能被声明为虚函数 不能声明为虚函数的函数示例代码及解释一、构造函数不能是虚函数二、静态成员函数不能是虚函数三、友元函数不能是虚…

反转链表-力扣

该题使用虚拟头节点来做在思考的时候稍微有点复杂&#xff0c;但与从头节点开始&#xff0c;利用一个cur节点来反转流程是一样的&#xff0c;只需将dummyhead->next 当作是 cur 来操作即可。代码如下&#xff1a; /*** Definition for singly-linked list.* struct ListNod…

【电控笔记5.9】编码器脉冲计算速度MT法

总结 编码器的脉冲计算速度可以使用多种方法,其中一种常用的方法是“MT法” (Measuring Time Method),即测量时间法。该方法通过测量编码器脉冲间的时间来计算速度。这种方法在高精度速度测量中非常有效,特别是在速度较低时。 MT法计算速度的基本原理 MT法的基本原理是通过…

Windows基本知识整理

Windows操作系统是微软公司开发和发布的一系列操作系统的总称&#xff0c;它广泛应用于个人电脑、服务器、移动设备等。以下是Windows操作系统的一些基本知识整理&#xff1a; 1. 版本历史 早期版本&#xff1a;包括Windows 1.0至Windows ME。Windows XP&#xff1a;于2001年…

word如何按照原本页面审阅文档

1 视图-阅读视图 2 视图&#xff0c;自己看&#xff0c;懒得打字了哈哈

HTML的基石:区块标签与小语义标签的深度解析

&#x1f4da; HTML的基石&#xff1a;区块标签与小语义标签的深度解析 &#x1f310; 区块标签&#xff1a;构建网页的框架&#x1f3e0; <div>&#xff1a;万能的容器&#x1f4da; <section>、<article>、<aside>&#xff1a;语义化的布局 &#x1…

通过python读取并发送二进制文件到串口

代码 #!python.exe """ filename send_bin.py brief According to the users input, read bin file, subpackage and send the file by UART. HowToUse send_bin.py -h author shadowThreeDgmail.com data 20220224 &q…

vulhub——ActiveMQ漏洞

文章目录 一、CVE-2015-5254(反序列化漏洞)二、CVE-2016-3088&#xff08;任意文件写入漏洞&#xff09;2.1 漏洞原理2.2 写入webshell2.3 写入crontab 三、CVE-2022-41678&#xff08;远程代码执行漏洞&#xff09;方法一方法2 四、CVE-2023-46604&#xff08;反序列化命令执行…

【退役之重学Java】关于 Ribbon

一、负载均衡 Nginx 和 Ribbon 都能做负载均衡&#xff0c;区别在哪儿&#xff1f; Nginx 负责服务器负载均衡Ribbon 负责本地负载均衡 Nginx 是服务器负载均衡&#xff0c;客户端所有请求都会交给 Nginx&#xff0c;然后由 Nginx 实现转发请求。即负载均衡是由服务端实现的 Ri…

升级版网创教程wordpress插件自动采集并发布

主要功能&#xff1a; wordpress 插件主题系列支持自动采集并发布。 主要采集: 福缘&#xff0c;中创&#xff0c;冒泡 自动采集各大项目网进行整合发布到自己个人网站 插件话更新&#xff0c;减少网络请求&#xff0c;提升稳定性 代码完美开源 傻瓜式操作&#xff0c;一…

C++纯文字解谜游戏

1.前言 Hello,我是老六工作室,今天我们搞一个C++纯文字解谜游戏,后面有代码与解析。 感谢支持,点赞鼓励一下,谢谢! 2.代码时间 #include<iostream> #include<windows.h> #include<conio.h> int power=0,light=0; using namespace std; int main() …

C4.5算法【python,算法,机器学习】

优点 可以处理缺失值。特征只能使用一次。可以剪枝&#xff0c;可以避免过拟合问题。 缺点 不适合大数据集的训练&#xff0c;因为受内存大小影响。 计算流程 对于单个特征 A, 我们做如下假设&#xff1a; 有两个判断值yes和no, 概率分别为 p y p_y py​和 p n p_n pn​。…

【MySQL】MySQL的安装和基本概念

MySQL的安装和基本概念 一、环境安装1、环境及配置2、下载安装 二、基本概念1、主流数据库2、mysql和mysqld的区别和概念&#xff08;1&#xff09;概念1&#xff1a;了解CS结构&#xff08;2&#xff09;概念2&#xff1a;数据库指的是什么&#xff08;3&#xff09;概念3&…

记录:mac pro 16-inch,2019安装ubuntu双系统

需要的装备&#xff1a;u盘&#xff0c;扩展坞、有线键鼠、ext4硬盘 目的&#xff1a;编译aosp 11 1、首先是参照如下文章&#xff0c;分配空间&#xff0c;制作启动盘&#xff08;测试ubuntu20.04不行&#xff0c;ubuntu22.04正常&#xff09; https://blog.csdn.net/LBSGKD…

天堂W游戏内核驱动保护简单分析(五)

NP 双机调试分析 1. 调用了NtQuerySystemInformation(SystemKernelDebuggerInformation) 来检测os是否是调试模式的进程 PROCESS ffff920744e6c300 SessionId: 1 Cid: 1a34 Peb: bc82205000 ParentCid: 111c DirBase: 23c33c000 ObjectTable: ffffa9…

【Linux】:进程切换

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux进程切换的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

PMP考试做对多少题才算及格?

2024年6月PMP考试即将来临&#xff0c;考生除了要复习好考试内容&#xff0c;也要提前了解考试后的成绩查询问题。顺利通过PMP考试是所有参加PMP认证考试考生的目标&#xff0c;那么2024年6月PMP考试怎么才算通过呢&#xff1f; PMP考试改版后试卷总共180道单选题多选题(改版前…

【AI副业教程】日赚5000+涨粉3000,自媒体新玩法!

​StartAI是一款专为设计师打造的基于Photoshop的AI工具&#xff0c;它提供了一系列强大的AI功能如&#xff1a;文生图、生成相似图、线稿上色、无损放大、局部重绘、扩图、艺术融合、提示词、智能擦除、风格选择等。https://www.istarry.com.cn/?sfromHGtsRq 你们能想象吗&a…

【Android安全】AOSP版本对应编号| AOSP版本适配Pixel或Nexus型号 | 驱动脚本下载地址

AOSP版本对应编号 https://source.android.com/docs/setup/about/build-numbers?hlzh-cn#source-code-tags-and-builds 例如android-8.1.0_r1 对应的编号是OPM1.171019.011 可以适配Pixel 2 XL AOSP驱动脚本下载 编译AOSP时&#xff0c;需要Google的驱动&#xff0c;后面才…

【分享】3种方法取消PPT的“限制保护”

PPT如果设置了有密码的“只读方式”&#xff0c;每次打开PPT&#xff0c;都会出现对话框&#xff0c;提示需要输入密码才能修改文件&#xff0c;否则只能以“只读方式”打开。 以“只读方式”打开的PPT就会被限制&#xff0c;无法进行编辑修改等操作。那如果后续不需要“限制保…