7
西门子模块6ES7221-1BF22-0XA8型号大全
一、概论
分布式监控系统已在工业领域得到广泛应用,许多企业对于中小规模的设备,如中小型热电厂和水电站,出于硬件软件投资利润率和性能价格比的考虑,常常是自行开发或参与开发本企业的监控系统。而许多企业在成套引进大型DCS系统后,也常因实际情况而需要自行开发或改进其监控系统。
分布式监控系统以微机为基础,用数据通信将微机连在一起实现数据共享,从而对工业过程进行集中监视管理和分散控制。因此,分布式监控系统中通信的设计与实现是至关重要的环节。Visual Basic开发语言具有简洁明了、编程效、开发的特点,利用VB中的多种通信手段,可实现分布式监控系统的多种通信功能。
二、与下位机的通信
分布式监控系统的数据采集站可直接与现场带有标准RS-232C接口的智能仪表、PLC和单片机等链接,并可通过扩展控制卡形成一个数据采集子网,以高速准确地数据。VB的MSCOMM通信控件具有完善的串口数据发送和接受功能,利用它可以屏蔽对硬件的操作,简易快捷地进行串行通信编程。
本文的实例为上位机与OMRON 200HG系列PLC的1:N链接通信。带有RS-485接口通信板的PLC直接挂在RS-485总线上,上位机通过RS-232C /RS-485转换器与总线相连,这样即构成数据采集子网,甚至可以是一个立的小型分布式监控系统。其它仪器仪表设备,只要是标准串口都可以类似方式直接或间接与上位机链接。
关于VB的MSCOMM控件可参考相关资料。本例通信程序摘要如下:
(1)初始化程序
mport=2 ' 选择COM2
Mscomm1.Settings="9600,N,8,2" ' 设置通信参数
Mscomm1.bbbbblen=0 ' 读入接收缓冲区全部字符
Mscomm1.OutbufferSize=256 ' 设置发送缓冲区大小
Mscomm1.InbufferSize=512 ' 设置接收缓冲区大小
Mscomm1.PortOpen=True '打开COM2
(2)发送命令程序
比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:
Dim Command, node, begin, number as bbbbbb
Dim Answerlen as integer node="03" '节点号
Command="RR" '命令为读IR区
begin="0000" '从IR000开始
number=10 '读取长度
Answerlen=51 '计算接收字符串长度
进行命令发送和接收应答处理:
Dim FCS, I as integer
Dim s ,f as bbbbbb
s="@"+node+Commad+begin+number
FCS=0
For i=1 to Len(s)
FCS=FCS xor Asc(Mid$(s,i,1) ) '帧校验码FCS
Next i
f=Hex$(FCS)
If Len(f)=1 Then f="0"+f
Commfrm.MSComm1.Output=s + f + "*" + CHR$(13) '命令帧发送
Do
Dummy=DoEvents()
Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen '等待应答帧
Do tag1= Commfrm.MSComm1.bbbbb
Loop Untill Commfrm.MSComm1.InbufferCount=0 '读完应答帧
上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。
三、节点自身的"通信"
节点自身的"通信"是一种形象的说法,严格说来应是VB应用程序利用DDE技术与本节点其它bbbbbbs应用程序进行数据交换。DDE(Dynamic Data Exchange)即动态数据交换,它是bbbbbbs支持的三种内部通信机制之一,是应用程序间通过共享内存进行进程间通信的一种形式。应用程序间进行数据交换称为"会话"(Conversation),申请会话端叫客户(Client),响应申请端叫服务器(Server)。一旦客户与服务器间建立起DDE所需的数据链路就可自动进行数据交换。
在监控系统开发中,工控组态软件以其功能强大、使用方便等特点得到广泛应用,但在处理复杂数据时其计算功能受到一定限制,而VB可以较好地这一不足,并且还能承担数据采集、报表打印等功能。这就需要在VB应用程序与组态软件应用程序间进行动态数据交换。
VB中只有TextBox、PictureBox、Label和bbbb可以与其它应用程序进行动态数据交换,控件用于DDE的属性项有bbbbTopic(连接主题)、bbbbItem(连接项)、bbbbMode(连接模式)和bbbbTimeout(连接等待时间)。
这里以本实验室的小型分布式监控实验系统为例,介绍一个VB应用程序与组态王5.0应用程序间实现DDE的实例。
1、VB作为Server,组态王作为Client
当有些参数需要从VB应用程序传输到组态王应用程序,如VB从PLC采集水位值参数至程序Ser.vbp的Text1,再将数据动态传递给组态王的I/O变量SW,这时VB作为Server,组态王作为Client。
VB程序Ser.vbp 中属性设置如下(bbbb1为Text1所在窗体):
bbbb1.bbbbTopic = "water" 数据交换的话题
bbbb1.bbbbMode = 1 作为服务器
组态王的设置如下:
新建一个名为vbdde的DDE设备,服务程序名Ser,话题名water,数据交换方式为标准bbbbbbS项目交换。新建一个名为SW的I/O变量,连接设备设为vbdde,项目名设为Text1。
2、组态王作为Server,VB作为Client
当有些参数需要从组态王传输到VB,如为了提高变频器电压以提升泵速,可在组态王应用程序中改变I/O变量BS值并动态传递给VB的Text2,VB接收到数据后经处理再传递给PLC相应继电器区。这时组态王作为Server,VB作为Client。
组态王设置如下:
新建一个名为BS的I/O变量,连接设备设为已建立的vbdde设备,项目名设为bengsu。
VB程序Ser.vbp中设置如下:
Text2.bbbbTopic = "view|tagname"
Text2.bbbbItem = "bengsu"
Text2.bbbbMode = 1
TextBox控件有无连接、自动式连接、被动式连接和通知式连接四种连接模式,可依据实际情况灵活运用。
四、网络通信
VB6.0与旧版本相比较,明显的特点是增加了强大的网络功能,将其用于分布式监控系统中可以轻松地实现远程通信。VB的WINSOCK控件有效屏蔽了对bbbbbbS套接字的低层操作,可方便地建立起网络中任意两个具有IP地址节点间的连接,并通过UDP或TCP协议进行数据交换,可用于创建Client/Server应用程序。
本文举分布式监控系统中节点间通信的实例,其中节点A(IP地址202.114.102.134)作为服务器负责某一区域的数据采集与处理,程序内有一名为TCPServer的Winsock控件;节点B(IP地址202.114.102.135)是同级或上一级的某一节点,作为客户机,其程序内有一名为TCPClient的Winsock控件。
节点A服务器程序如下:
(1)初始化程序
tcpserver(0).RemoteHostIP = 202.114.102.135
tcpserver(0).LocalPort = 1001 'tcpserver(0)于侦听
tcpserver(0).Listen
(2)发送数据程序
tcpserver(Index).SendData Text1.Text
(3)处理客户机连接请求程序
Private Sub TCPServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Load tcpserver(Index)
tcpserver(Index).Accept requestID
End Sub
(4)客户机数据到达处理程序
Private Sub TCPServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim RD As bbbbbb
tcpserver(Index).GetData RD, vbbbbbbb
txtRD.text=RD
tcpserver(Index).SendData RD
End Sub
(5)关闭连接程序
Private Sub TCPServer_Close(Index As Integer)
tcpserver(Index).Close
Unload tcpserver(Index)
End Sub
以上程序着重说明Winsock控件的主要属性、方法和事件,如要实现多进程(多个客户程序同时运行),可应用创建控件数组来代表已连接的控件实例的方法处理。
节点B客户机程序如下:
Private ConnectFlag As Boolean '设置判断是否连接标志
(1)初始化程序
TCPClient.RemoteHost IP= 202.114.102.134 '远程计算机IP地址
TCPClient.RemotePort = 1001 '远程计算机端口
ConnectFlag = False
(2)申请连接程序
If Not ConnectFlag Then
TCPClient.Close
TCPClient.Connect
Do
DoEvents
Loop Until TCPClient.State = sckConnected
ConnectFlag = True
End Sub
(3)数据到达处理程序
Private Sub TCPClient_DataArrival(ByVal bytesTotal As Long)
Dim RD As bbbbbb
TCPClient.GetData RD, vbbbbbbb
txtRD.text = RD
End Sub
(4)发送数据程序
TCPClient.SendData txtSD.Text
(5)关闭连接程序
Private Sub TCPClient_Close()
TCPClient.Close
Do
DoEvents
Loop Until TCPClient.State = sckClosed
ConnectFlag = False
End Sub
五、远程通信
当监控系统的一些重要信息,如严重事故,需要及时通知有关部门即实现远程通信时,可以利用网络中某一连接至Internet的带有MODEM的节点,通过MODEM自动拨打电话,将信息及时地送达有关部门。
应用VB的MSCOMM控件可实现这一功能,基本方法与下位机通信类似。这里介绍调用API函数直接写I/O端口,使用设备控制块DCB的方法拨打电话并挂起MODEM。
利用VB的API Viewer浏览器在module1模块中声明对以下函数、数据类型和常量的引用:
CreateFile 函数
CloseHandle 函数
BuildCommDCB 函数
SetCommState 函数
DCB数据类型
GENERIC_READ常量
GENERIC_WRITE 常量
OPEN_EXISTING 常量
(1)MODEM设置子程序
Public Function ModemSetup( ) As Boolean
Dim lResult As Long
Dim lCommHandle As Long
Dim DCB_Comm As DCB
Dim tDCBConfig As bbbbbb
ModemSetup = True 'lCommHandle为通信源对象的句柄
lCommHandle = CreateFile(COM2,GENERIC_READ or GENERIC_WRITE, _ 0&, 0&, OPEN_EXISTING, 0&, 0&)
'构造DCB对象的初始化字符串
tDCBConfig = "baud=9600" & "parity=NONE" & "data=8" & "stops=1"'用初始化字符串DCB对象的规范
lResult = BuildCommDCB(tDCBConfig, DCB_Comm) '根据DCB对象的规范来设定通信设备
lResult = SetCommState(lCommHandle, DCB_Comm)
lResult = CloseHandle(lCommHandle) End Function
(2)发送数据子程序
Public Function ModemSD(tComm As bbbbbb, tModemSend As bbbbbb) As Boolean
Dim nModem As Integer
ModemSS = True
nModem = FreeFile
Open tComm For Output As nModem
Print #nModem, tModemSend
Close #nModem End Function
(3)主程序
ModemSetup
ModemSS(COM2, "ATDT" &"02767802169"& vbCr)
ModemSS(COM2, "ATDT" & txt1.Text & vbCr)
ModemSS(COM2, "ATH" & vbCr)
本例重在说明基本原理,没有加入错误捕获陷阱及通信异常处理。
六、结束语
本文介绍了应用VB开发分布式监控系统的各种通信功能的基本原理和实例。通过以上实例可以看出,用VB开发通信程序简洁明了,编程效,可维护性好,尤其适用于自行开发中小型分布式监控系统。
弄通有关PLC程序设计理论是重要的。没有这方面的理论准备或指导,仅靠在实践中摸索,简单的问题还好办。复杂的就不好办了。不仅无从下手,而且花了很多时间与精力,也难编出效率较高、质量也较高的程序,常常是事倍功半。
但是,编程的具体实践,以及在这个实践中得来的知识或技能,即经验,也是重要的。没有经验,仅有理论,既无法深刻理解理论,又无法灵活应用理论。这正如学数学,如仅了解一些定理或记住一些公式,没有作相应的练习,肯定是学不好的。不用说,任何理论也都只是经验的总结,归根到底也都有是来自实践。
1、经验积累
经验有别人的,也有自己的,都很重要。前者要靠细心学习,后者要靠用心积累,都要在一定的时间与必要的精力。
别人的经验有上了书的或登载在杂志上的。有的是细心学习别人的,但多数是我自己的经验。所有的例子都经我测试过,都经实践证明是可行的。我想,别的书本或杂志上介绍的也会是这样的。所以学习这样杨功的经验是必要的。
还有就是你同事的经验,也是值得学习。这种经验离你很“近”,很易借鉴。
自己的经验则是重要的。要在自己的实践中,积累自己的经验。同时,在学别人的经验时,也能亲自作些测试,能使自己也有类似的经历,进而把这些经验变成自己的。这也是自己经验的重要积累。
还有一些失败的经验,这往往是不会公开的,但这些经验也要学习,也要积累。
经验的积累要用自己的脑记,要用电脑记。作些分类,建立一个自用的程序库,以便于随时引用。
2、经验升华
经验还有待升华。升华有三个层次:
的层次就是建立一个典型的程序库,供今后再用。若程序复杂,还可建一些功能块,或子程序,以便以后引用。
其次,要总结出有效算法。如单按钮起停程序库等。
层次的升华是把经验上升到理论的高度,为丰富PLC程序设计理论作贡献。我想,随着PLC使用的普及与提高,是会有越来越多从经验中升华出来的,而又能用以指导实践的PLC编程理论的。
3、经验应用
经验积累、经验升华都是为了应用。经验应用有三方面:
1)用作工程设计模板。设计新系统时,选用一个或几个与现设计工程类似的,已成功的工程,作样板进行设计。这既可减轻设计的工作量,又增加设计的成功率。这也是信息可重用的一大好处。
2)用作程序设计参考。在无成功的工程可作样板时,在新设计的逻辑中,仍有相当一部分控制逻辑,可采用或借用已有典型逻辑,这也可减少设计的工作量,增加设计的成功率。
3)用作算法设计参考。在既无样板可参照,又无典型可采用时,还可运用过去的一些成功的算法。
经验是宝贵的,但是经验特别是个人经验,总是有限的。所以,经验的应用也还要与编程理论相结合
串口通讯-网络通信的数据包(帧)
在网络通信中, " 包 " ( Packet )和 " 帧 " ( Frame )的概念相同,均指通信中的一个数据块.对于具体某种通信网络,一般使用术语 " 帧 " .一种网络的帧格式可能与另一种网络不同,通常使用术语 " 包 " 来指一般意义的帧.串行通信的数据格式有面向字符型的数据格式,如单同步、双同步、外同步;也有面向比特型的数据格式,这以帧为单位传输,每帧由六个部分组成,分别是标志区、地址区、控制区、信息区、帧校验区和标志区.
串行通信协议属于 ISO 参考标准的三层,数据链路层.数据链路层使用物理层提供给它的服务.物理层所做的工作是接收个一个原始的比特流,并准备把它交给目的地.不能**这个比特流无差错.所接收的比特的数量也许少于,也许等于或多于所传递的比特的数量,它们具有不同的值.一直要上到数据链路层才能进行检测,如果需要的话,纠正错误.对于数据层,通常的方法是把比特流分成离散的帧,并对每一帧计算出校验和…….当一帧到达目的地后重新计算校验和时,如果新算出的校验和不同于帧中所包括的值,数据链路层就知道出现差错了,从而会采取措施处理差错(即,丢弃坏帧,并发回一个差错报告).
数据链路层的任务是在两个相邻接点间的线路上无差错地传送以帧为单位的数据.每一帧包括数据和必要的控制信息.人们发现,对于经常产生误码的实际链路,只要加上合适的控制规程,就可以使通信变为比较的.如 IBM 公司推出了的体系结构 SNA, 在 SNA 的数据链路规程采用了面向比特的规程 SDLC ,后来 ISO 把它修改后称为 HDLC ,译为数据链路控制.在 INTERNET 中,用户与 ISP ( INTERNET 服务提供者)之间的链路上使用得多的协议就是 SLIP 和 PPP .
下面就简单介绍 HDLC 帧结构以及 PPP 帧结构:
1.HDLC 的帧结构:
从网络层交下来的分组,变成为数据链路层的数据.这就是图 1 中的信息字段.信息字段的长度没有具体规定.数据链路层在信息字段的头尾各加上 24bit 的控制信息,这样就构成了一个完整的帧. HDLC 规定了一个帧的开头(即部中的个字节)和结尾(即尾部中的后一个字节)各放入一个特殊的标记,作为一个帧的边界. 这个标记就叫做标志字段 F .标志字段 F 为6个连续1加上两边各一个0共8位.地址字段 A 也是8个比特,它一般被写入次站的地址.帧校验序列 FSC 字共占16位,采用 CRC-CCITT 生成多项式.控制字段功8位,是复杂的字段 ,HDLC 的许多重要功能都要靠控制字段来实现.根据其两个比特的取值,可将 HDLC 的许多帧划分为三大类,即信息帧、监督帧和无编号帧.
2. 点对点协议 PPP 的帧结构:
PPP 帧格式和 HDLC 的相似, PPP 帧的前 3 个字段和后两个字段和 HDLC 的格式是一样的. PPP 不是面向比特的,因而所有的 PPP 帧的长度都是整数个字节.与 HDLC 不同的是多了一个 2 个字节的协议字段.当协议字段为 0X0021 时,信息字段就是 IIP 数据报.若为 0XC021, 则信息字段是链路控制数据,而 0X8021 表示这是网络控制数据.
3. 例子:异步通信的数据格式
可以看出,按标准的饿异步通信数据格式, 1 个字符在传输事,除了传输实际编码信息外,还要传输几个外加数位.具体说,在一个字符开始传输前,输出线在逻辑上处于 "1" 状态,这称为标识态.传输一开始,输出线由标识态变为 "0" 状态,从而作为起始位.起始位后面为 5 ~ 8 个信息位,信息位有低往高排列,即位为字符的位,在同意个传输系统中,信息位的数目是固定的.信息位后面为校验位,校验位可以按奇校验设置,也可以按偶校验设置,也可以不设置.后的位数为 "1" ,它作为停止位,停止位可为 1 位、 1.5 位或者 2 位.如果传输 1 个字符以后,立即传输下一个字符,那么,后一个字符的起始位变紧挨着个字符的停止位了,否则,输出线又会进入标识态.