modbus与plc通讯 vb程序caoxi

modbus与plc通讯 vb程序caoxi
modbus与plc通讯 vb程序caoxi

该程序可以实现实时数据采集显示,以及能对寄存器进行设置。

程序很简单,想用的可以完善,现在只能实时采集显示一个地址的数据,只要修改一下,就可以实时采集多个地址的数据。现在也只能一次对一个寄存器进行设置,也可以更加完善。

下面是运行界面,采集的模块的地址为75,是一个温湿度采集模块。有3个寄存器,显示的数据上是温度,湿度,露点温度。

modbus

Private Sub Command1_Click() '设置按钮

Dim bisend() As Byte

Dim crc

Dim btLoCRC As Byte, btHiCRC As Byte

Dim Data As Integer

If MSComm1.PortOpen = True Then

If Combo5.ListIndex = 0 Then

ReDim bisend(7) '重新定义数组长度

bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码

bisend(1) = "&h" + Hex(3) '功能码读寄存器

bisend(2) = "&h" + Hex(0) '起始地址高位

bisend(3) = "&h" + Hex(0) '起始地址低位

bisend(4) = "&h" + Hex(0) '寄存器个数高位

bisend(5) = "&h" + Hex(Combo6.ListIndex + 1) '寄存器个数低位

crc = CRC16(bisend, 6, btLoCRC, btHiCRC)

bisend(6) = "&h" + Hex(btLoCRC) 'CRC高位

bisend(7) = "&h" + Hex(btHiCRC) 'CRC低位

'发送数据

MSComm1.Output = bisend

Else

ReDim bisend(10) '一次只能写一个寄存器

bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码

bisend(1) = "&h" + Hex(16) '功能码写寄存器

bisend(2) = "&h" + Hex(0) '起始地址高位

bisend(3) = "&h" + Hex(0) '起始地址低位

bisend(4) = "&h" + Hex(0) '寄存器个数高位

bisend(5) = "&h" + Hex(1) '寄存器个数低位

bisend(6) = "&h" + Hex(2) '字节数

Data = Val(Trim(Text3.Text))

bisend(7) = "&h" + Hex(Data \ 256) '要写入寄存器的值的高字节

bisend(8) = "&h" + Hex(Data Mod 256) '要写入寄存器的值的低字节

crc = CRC16(bisend, 9, btLoCRC, btHiCRC)

bisend(9) = "&h" + Hex(btLoCRC) 'CRC高位

bisend(10) = "&h" + Hex(btHiCRC) 'CRC低位

MSComm1.Output = bisend

End If

Else

MsgBox "串口没有打开"

End If

End Sub

Private Sub Command2_Click() '实时采集按钮

Timer1.Enabled = Not Timer1.Enabled '进行状态切换

End Sub

Private Sub Command3_Click()

'初始化,并打开串口

With MSComm1

If .PortOpen = False Then

.CommPort = Combo7.ListIndex + 1 '打开串口1

.Settings = Combo1.Text + "," + Combo2.Text + "," + Combo3.Text + Combo4.Text

.InputMode = 1

.InputLen = 50 '一次性从接收缓冲区中读取所有数据(8个字节为一组!!)

.InBufferCount = 0 '清空接收缓冲区

.OutBufferCount = 0 '清空发送缓冲区

.RThreshold = 5 + (Combo6.ListIndex + 1) * 2

.InBufferSize = 1024

.OutBufferSize = 1024

.PortOpen = True

Else

MsgBox "串口已经打开"

End If

End With

End Sub

Private Sub Command4_Click() '关闭串口按钮

If MSComm1.PortOpen = True Then

MSComm1.PortOpen = False

End If

End Sub

Private Sub Form_Load()

Dim i As Integer

'波特率设置

Combo1.AddItem "4800", 0 Combo1.AddItem "9600", 1 Combo1.AddItem "115200", 2

'校验位设置

Combo2.AddItem "N", 0

Combo2.AddItem "E", 1

Combo2.AddItem "O", 2

'数据位设置

Combo3.AddItem "7", 0

Combo3.AddItem "8", 1

'停止位设置

Combo4.AddItem "1", 0

Combo4.AddItem "2", 1

'功能码选择

Combo5.AddItem "读寄存器03", 0 Combo5.AddItem "写寄存器16", 1

'寄存器个数设置

Combo6.AddItem "1", 0

Combo6.AddItem "2", 1

Combo6.AddItem "3", 2

Combo6.AddItem "4", 3

Combo6.AddItem "5", 4 Combo6.AddItem "6", 5

Combo6.AddItem "7", 6

Combo6.AddItem "8", 7

Combo6.AddItem "9", 8

Combo6.AddItem "10", 9 Combo6.AddItem "11", 10 Combo6.AddItem "12", 11 Combo6.AddItem "13", 12 Combo6.AddItem "14", 13

Combo6.AddItem "15", 14

Combo6.AddItem "16", 15

Combo6.AddItem "17", 16

Combo6.AddItem "18", 17

Combo6.AddItem "19", 18

Combo6.AddItem "20", 19

Combo6.AddItem "21", 20

Combo6.AddItem "22", 21

'串口选择

Combo7.AddItem "串口1", 0

Combo7.AddItem "串口2", 1

Combo7.AddItem "串口3", 2

Combo7.AddItem "串口4", 3

'初始赋值

Combo1.ListIndex = 1

Combo2.ListIndex = 1

Combo3.ListIndex = 1

Combo4.ListIndex = 0

Combo5.ListIndex = 0

Combo6.ListIndex = 2

Combo7.ListIndex = 0

'初始化串口

End Sub

Private Sub Form_Unload(Cancel As Integer)

If MSComm1.PortOpen = True Then

MSComm1.PortOpen = False

End If

End Sub

Private Sub MSComm1_OnComm()

Dim INByte() As Byte

Dim Buf As String

Dim btLoCRC As Byte, btHiCRC As Byte

Dim Data As Integer

If https://www.360docs.net/doc/6d16184740.html,mEvent = comEvReceive Then '接收到数据以后

INByte = MSComm1.Input

If INByte(1) = 3 Then '读寄存器

'CRC校验

crc = CRC16(INByte, UBound(INByte) - LBound(INByte) - 1, btLoCRC, btHiCRC)

If INByte(UBound(INByte) - 1) = btLoCRC And INByte(UBound(INByte)) = btHiCRC Then

'校验正确

'////////////////////////////////////

For i = 3 To UBound(INByte) - 2 Step 2

Data = "&h" + Hex(INByte(i)) + Hex(INByte(i + 1))

' Buf = Buf + Hex(INByte(i)) + Chr(32)

Buf = Buf + Str(Data) '转换为十进制显示

Next i

List1.AddItem Buf

End If

End If

MSComm1.InBufferCount = 0 '请缓存

End If

End Sub

Private Sub Timer1_Timer()

'定时发送命令

Dim tbisend(7) As Byte

Dim crc '定时1s

Dim btLoCRC As Byte, btHiCRC As Byte

Dim Buf As String

If MSComm1.PortOpen = True Then

tbisend(0) = "&h" + Hex(Val(Text1.Text)) '地址码

tbisend(1) = "&h" + Hex(3) '功能码读寄存器

tbisend(2) = "&h" + Hex(0) '起始地址高位

tbisend(3) = "&h" + Hex(0) '起始地址低位

tbisend(4) = "&h" + Hex(0) '寄存器个数高位

tbisend(5) = "&h" + Hex(Combo6.ListIndex + 1) '寄存器个数低位

crc = CRC16

(tbisend, 6, btLoCRC, btHiCRC)

tbisend(6) = "&h" + Hex(btLoCRC) 'CRC高位

tbisend(7) = "&h" + Hex(btHiCRC) 'CRC低位

'发送数据

MSComm1.Output = tbisend

End If

End Sub

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////

Function CRC16(Data() As Byte, no As Integer, CRC16Lo As Byte, CRC16Hi As Byte) As String Dim CL As Byte, CH As Byte '多项式码&HA001

Dim SaveHi As Byte, SaveLo As Byte

Dim i As Integer

Dim Flag As Integer

CRC16Lo = &HFF

CRC16Hi = &HFF

CL = &H1

CH = &HA0

For i = 0 To no - 1

CRC16Lo = CRC16Lo Xor Data(i) '每一个数据与CRC寄存器进行异或

For Flag = 0 To 7

SaveHi = CRC16Hi

SaveLo = CRC16Lo

CRC16Hi = CRC16Hi \ 2 '高位右移一位

CRC16Lo = CRC16Lo \ 2 '低位右移一位

If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1

CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1

End If '否则自动补0

If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或

CRC16Hi = CRC16Hi Xor CH

CRC16Lo = CRC16Lo Xor CL

End If

Next Flag

Next i

Dim ReturnData(1) As Byte

ReturnData(0) = CRC16Hi 'CRC高位

ReturnData(1) = CRC16Lo 'CRC低位

CRC16 = ReturnData

End Function

'CRC低位字节值表

Function GetCRCLo(ind As Long) As Byte

GetCRCLo = Choose(ind + 1, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _

&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _

&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _

&H0, &HC1, &H81, &H40, &H1, &HC1, &H80, &H41, &H0, &HC1, _

&H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, _

&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, _

&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H81, &H41, _

&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _

&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _

&H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _

&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81,

&H40, _

&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _

&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _

&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _

&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _

&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _

&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _

&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _

&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _

&H80, &H41, &H0, &HC1, &H81, &H40)

End Function

'CRC高位字节值表

Function GetCRCHi(ind As Long) As Byte

GetCRCHi = Choose(ind + 1, &H0, &HC0, &HC1, &H1, &HC3, &H3, &H2, &HC2, &HC6, &H6, &H7, &HC7, &H5, &HC5, &HC4, &H4, &HCC, &HC, &HD, &HCD, _

&HF, &HCF, &HCE, &HE, &HA, &HCA, &HCB, &HB, &HC9, &H9, _

&H8, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A, _

&H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4, _

&HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3, _

&H11, &HD1, &HD0, &H10, &HF0, &H30, &H31, &HF1, &O33, &

;HF3, _

&HF2, &H32, &H36, &HF6, &HF7, &H37, &HF5, &H35, &H34, &HF4, _

&H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, _

&H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, _

&HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &HED, _

&HEC, &H2C, &HE4, &H24, &H25, &HE5, &H27, &HE7, &HE6, &H26, _

&H22, &HE2, &HE3, &H23, &HE1, &H21, &H20, &HE0, &HA0, &H60, _

&H61, &HA1, &H63, &HA3, &HA2, &H62, &H66, &HA6, &HA7, &H67, _

&HA5, &H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, _

&H6E, &HAE, &HAA, &H6A, &H6B, &HAB, &H69, &HA9, &HA8, &H68, _

&H78, &HB8, &HB9, &H79, &HBB, &H7B, &H7A, &HBA, &HBE, &H7E, _

&H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74, &H75, &HB5, _

&H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71, _

&H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92, _

&H96, &H56, &H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C, _

&H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &

H5A, &H9A, &H9B, &H5B, _

&H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, &H8B, _

&H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C, _

&H44, &H84, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42, _

&H43, &H83, &H41, &H81, &H80, &H40)

End Function

VB控件Mscomm控件与PLC进行RSModbus通讯源码

V B控件M s c o m m控件与P L C进行 R S M o d b u s通讯源码集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V B控件M s c o m m控件与P L C进行R S485(M o d b u s)通讯源码本人用的是ModbusRTU通讯模式,通过计算机串口转RS485与外围设备通行通讯,读写外围设备指定地址里的数据,从而达到自动化控制远端设备。 DimHiByteAsByte DimLoByteAsByte DimCRC16LoAsByte DimCRC16HiAsByte DimReturnData(1)AsByte DimKAsInteger DimCmdLenthAsInteger PrivateSubCommand1_Click() K=Text9.Text'写6个字节 Text13.Text="" '===========数组赋值输入代码 =============================================================== ======================== '<<算法一>> DimWriteStr()AsByte DimuAsInteger ReDimWriteStr(K+2)

Foru=0ToK WriteStr(u)=Val("&H"&Text1(u).Text) Next '<<算法二>> DimCRC_2()AsByte DimvAsInteger ReDimCRC_2(K) Forv=0ToK CRC_2(v)=Val("&H"&Text1(v).Text) Next '============================================================== ==================================== CallCRC161(CRC_2()) CallCRC16(WriteStr(),K) MSComm1.InBufferCount=0 '==========显示发送代码 =============================================================== ========================= DimmAsInteger Form=0To23 Ifm<=KThen Text8(m).Text=Hex(WriteStr(m))

VB与AB的PLC之间通讯

VB与AB的PLC之间通讯 2007-05-31 来源:西部工控网浏览:300 [推荐朋友] [打印本稿] [字体:大小] VB与AB PLC之间通讯 AB系列PLC一般都有专用驱动程序用于实现PLC和计算机之间通讯,如RSLINX 就是专门用于做这项工作,但使用RSLINX也具有一定局限性,这里提供一个使用VB编程实现PLC和计算机之间通讯程序,使用协议是DF1,可以支持Micrologix、SLC500等系列PLC。使用代码如下: Option Explicit Dim tns%, comunicating Private Sub Command1_Click() ReDim tb%(10) Dim st If ReadTable(0, tb%()) Then For st = 0 To 9 '显示结果 Text1.SelText = Str(tb%(st)) + Chr(32) Next st Text1.SelText = Chr(13) + Chr(10) End If End Sub Private Sub Command2_Click() ReDim tm%(5) tm%(0) = Rnd * 32768 tm%(1) = Rnd * 32768 tm%(2) = Rnd * 32768 tm%(3) = Rnd * 32768 tm%(4) = Rnd * 32768 If Not WriteTable(4, tm%()) Then Text1.SelText = "写入错误!!" End Sub Private Sub Exit_Click() Unload Me End End Sub Private Sub Form_Load() Comm1.PortOpen = True End Sub

VB与S7 200通讯

本文以下内容为采用VB6.0设计人机界面的工业控制计算机与S7-200PLC 自由口通信进行的方法。 常规的通过PC机,利用PLC对工艺对象的控制,大多都是在具有组态软件或通讯模块的情况下进行,但是对于一些小型的控制系统而言,由于受到简单实用和成本低的原则限制,不适合使用常规方法。利用Visual Basic结合PLC中的通信语言进行编程,实现上位机与PLC之间,在无通讯模块情况下的数据信息的双向通信传输。 SIMATIC S7-200内部集成的PPI接口物理特性为RS485,可在多种模式下工作,其中自由口通信方式是S7-200PLC的一个很有特色的功能,它可以与任何协议公开的其它设备、控制器等进行通信。上位机串口符合RS-232C标准协议,为了实现两者的通信必须进行协议转换,可以利用PC/PPI电缆连接两者,并同时完成协议转换的任务。 控制系统组成 基于VB和PLC的液压试验台监控系统结构如下图所示,主要由上位机监控系统和下位机控制系统组成。 VB6.0提供了串行端口通信控件MSComm,该控件封装了通信过程的底层操作,用户只需设置MSComm控件的属性和对相应的事件进行编程,即可完成串行通信功能。 MSComm控件提供了事件驱动和查询2种处理通信的方法,其中事件驱动方法通过设置CommEvent、Rthreshold等属性实现对MSComm控件的OnComm 事件驱动;查询方法则通常通过OutPut属性直接写输出缓冲区,且通过InPut 属性直接读输入缓冲区实现。因为事件驱动方法程序响应及时、可靠性高,所以本系统采用事件驱动方法实现工控机与PLC之间的串行通信。 1.S7-200PLC的自由口通信 西门子S7-200系列PLC的CPU支持多样的通信协议,如PPI接口协议、

VB与PLC的通信

利用VB6.0 实现PC 与三菱PLC 的通信 本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用编程电缆作为计算机与 PLC 通信的连线。 FX2系列PLC的编程接口采用RS-422标准,而计算机的串行口采用的是RS-232标准,因此作为实现PLC与计算机通信的接口模块FX-232AW,必须将RS-422标准转换成RS-232标准,同时在实现上述过程中采用光电隔离技术。 图1 一、串口的相关知识 1)串行通信的概念 图2 所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。如图2所示。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢 2)常见的串口通信规约: 目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,且直接用RS232相连。RS-232C: “1”=-3~-15;“0”=+3~+15速率:0~20000bps;一般传输距离:15m。RS-422:采用平衡传输,平衡发送器、差动接收器,速率:10Mbps/15m;90Kbps/1200m抗干扰能力强。

DB9和DB25的常用信号脚说明 由于FX 2-232AW 价格过贵所以我们选用选用MAXIM 公司的MAX202实现RS-232与TTL 之间的电平转换。MAX202内部有电压倍增电路和转换电路,仅需+5V 电源就可工作,使用十分方便;选用MAX490实现RS-485与TTL 之间的转换。每片MAX490有一对发送器/接收器,由于通信采用全双工 方式,故需两片MAX490,另外只需外接4只电容即可。PLC 的RS-422接口配接DB-25型连接器,而PC 机我们一般用DB-9型连接器。硬件电路图如上。 二、 通信控制线的连接 如图3,由于计算机的RS-232接口的4脚和5脚短接,因此,对计算机发送数 据来说,PLC 总是处于数据就绪状态。也就是说,计算机在任何时候都可以将数据送到PLC 内。又由于RS-232的接口的20脚和6脚交叉相连接,因此,对计算机接受数据来说,就必须检测PLC 是否处于准备就绪状态。如果6脚为1,这可以接受数据:如果6脚为0,则必须等待,直到为1时,才可以接受数据。

VB与PLC通信程序.doc

VB与PLC通信程序(欧姆龙PLC)(2007-08-01 21:00:11) 关于VB的MSCOMM控件可参考相关资料。通信程序摘要如下: (1)初始化程序 https://www.360docs.net/doc/6d16184740.html,mport=2 ’选择COM2 Mscomm1.Settings=”9600,N,8,2”’设置通信参数 Mscomm1.Inputlen=0 ’读入接收缓冲区全部字符 Mscomm1.OutbufferSize=256 ’设置发送缓冲区大小 Mscomm1.InbufferSize=512 ’设置接收缓冲区大小 Mscomm1.PortOpen=True ’打开COM2 (2)发送命令程序 比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有: Dim Command, node, begin, number as string 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 string 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.Input Loop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧 上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。

三菱PLC与PC上位机VB通讯

三菱PLC与PC上位机VB通讯 三菱PLC:FX1N + FX1N-232-BD FX2N + FX2N-232-BD 计算机:Windows XP中文企业版+ V isual Basic 6.0中文企业版 Windows 98中文版+ V isual Basic 6.0 中文企业版 两者之间连接使用的是FX-232CAB-1电缆线(2-3,3-2,4-6(8),5-5) 一.三菱PLC的设置 三菱FX PLC在进行计算机链接(专用协议)和无协议通讯(RS指令)时均须对通讯格式(D8120)进行设定。其中包含有波特率、数据长度、奇偶校验、停止位和协议格式等。在修改了D8120的设置后,确保关掉PLC的电源,然后再打开。 此外,对于采用RS485形式1:N计算机链接的还必须对站点号(D8121)进行设定。设定的范围从00H到0FH(即0到15)。 在这里对D8120采用下述设置: b15 b0 0110 1000 1000 1110 6 8 8 E 即数据长度为7位,偶校验,2位停止位,波特率为9600bps,无标题符和终结符,采用计算机链接(RS-232C),自动添加和校验码,采用专用协议格式1。 同时设定站号为0。具体设定如下所示: FX PLC进行计算机链接时可用的专用协议有两种:格式1和格式4。两种格式的差别在于是否在每一个块上添加了CR + LF,其中添加了CR + LF的是格式4。在这里采用格式1。 二.上位机程序的编制 这里采用Microsoft公司的Visual Basic 6.0中文企业版编制上位机程序。 Visual Basic中提供了一个名为MSComm的通信控件便于设计串行通信的程序。MSComm控件的主要属性有: 1.CommPort属性 CommPort属性用于指定所要使用的串行端口的号码。虽然Windows操作系统可以容纳最多256个串行通信端口,不过Visual Basic的MSComm控件则仅限于16个端口。 2.Settings属性 Settings属性用于设置初始化参数。以字符串的形式设置波特率、奇偶校验、数据位、停止位等4个参数。其格式为“BBBB,P,D,S”,其中BBBB表示波特率,P表示奇偶校验位检查方式,D表示数据位数,S表示停止位数。一般情况下,欧美仪器习惯使用“9600,n,8,1”当成设置值;而日本仪器则习惯使用“9600,e,7,2”作为设置值。Settings设置完成之后,所传输及接受的字符串便以此设置为准,使用RS-232通信的双方,Settings必须完全一样,彼此才能顺利地通信,否则双方将无法正确接收到彼此所传输的信号。所以,该属性的设置必须和三菱PLC中D8120的相关设置保持一致。在这里,统一采用“9600,e,7,2”的设定。

VB与PLC通信程序(欧姆龙PLC)

VB与PLC通信程序(欧姆龙PLC) 分类:| 转自:原文地址被1人转藏+放进我的宝盒2010-9-2 21:45:46 VB与PLC通信程序(欧姆龙PLC) 关于VB的MSCOMM控件可参考相关资料。通信程序摘要如下: (1)初始化程序 https://www.360docs.net/doc/6d16184740.html,mport=2 ’选择COM2 Mscomm1.Settings=”9600,N,8,2”’设置通信参数 Mscomm1.Inputlen=0 ’读入接收缓冲区全部字符 Mscomm1.OutbufferSize=256 ’设置发送缓冲区大小 Mscomm1.InbufferSize=512 ’设置接收缓冲区大小 Mscomm1.PortOpen=True ’打开COM2 (2)发送命令程序 比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有: Dim Command, node, begin, number as string 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 string 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.Input Loop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧 上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。

modbus与plc通讯 vb程序caoxi

该程序可以实现实时数据采集显示,以及能对寄存器进行设置。 程序很简单,想用的可以完善,现在只能实时采集显示一个地址的数据,只要修改一下,就可以实时采集多个地址的数据。现在也只能一次对一个寄存器进行设置,也可以更加完善。 下面是运行界面,采集的模块的地址为75,是一个温湿度采集模块。有3个寄存器,显示的数据上是温度,湿度,露点温度。 modbus Private Sub Command1_Click() '设置按钮 Dim bisend() As Byte Dim crc Dim btLoCRC As Byte, btHiCRC As Byte Dim Data As Integer If MSComm1.PortOpen = True Then If Combo5.ListIndex = 0 Then ReDim bisend(7) '重新定义数组长度 bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码 bisend(1) = "&h" + Hex(3) '功能码读寄存器 bisend(2) = "&h" + Hex(0) '起始地址高位 bisend(3) = "&h" + Hex(0) '起始地址低位 bisend(4) = "&h" + Hex(0) '寄存器个数高位 bisend(5) = "&h" + Hex(Combo6.ListIndex + 1) '寄存器个数低位 crc = CRC16(bisend, 6, btLoCRC, btHiCRC) bisend(6) = "&h" + Hex(btLoCRC) 'CRC高位 bisend(7) = "&h" + Hex(btHiCRC) 'CRC低位 '发送数据 MSComm1.Output = bisend Else ReDim bisend(10) '一次只能写一个寄存器 bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码 bisend(1) = "&h" + Hex(16) '功能码写寄存器 bisend(2) = "&h" + Hex(0) '起始地址高位 bisend(3) = "&h" + Hex(0) '起始地址低位 bisend(4) = "&h" + Hex(0) '寄存器个数高位 bisend(5) = "&h" + Hex(1) '寄存器个数低位 bisend(6) = "&h" + Hex(2) '字节数 Data = Val(Trim(Text3.Text)) bisend(7) = "&h" + Hex(Data \ 256) '要写入寄存器的值的高字节 bisend(8) = "&h" + Hex(Data Mod 256) '要写入寄存器的值的低字节

VB与三菱PLC通信

V B与三菱P L C通信 VB源代码下载 PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域。实现PC机与PLC通信的目的是为了示、窗口技术等多种功能,为PLC提供良好的人机界面。本文详细介绍了FX系列PLC的通信协议,并现了PC机与FX系列PLC之间的串行通信。本文对FX系列PLC的通信协议进行了详细的介绍,并以 1前言 PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域。实现PC机与PLC通信的目的是为了示、窗口技术等多种功能,为PLC提供良好的人机界面。本文详细介绍了FX系列PLC的通信协议,并现了PC机与FX系列PLC之间的串行通信。 2PC机与PLC实现通信的条件 带异步通信适配器的PC机与PLC只有满足如下条件,才能互联通信: (1)带有异步通信接口的PLC才能与带异步通信适配器的PC机互联。还要求双方采用的总线标准一致 (2)双方的初始化,使波特率、数据位数、停止位数、奇偶校验都相同。 (3)要对PLC的通信协议分析清楚,严格地按照协议的规定及帧格式编写PC机的通信程序。PLC中 3PC机及与FX系列PLC的串行通讯 3.1硬件连接 PC机与FX系列PLC不能直接连接,要经过FX-232AW单元进行RS232C/RS-422的 3.2FX系列PLC的通信协议 在PC机中必须依据互联的PLC的通信协议来编写通信程序,因此先介绍FX系列PLC的通信协议。 (1)数据格式 FX系列PLC采用异步格式,由1位起始位、7位数据位、1位偶校验位及1位停止位组成,波特率为9 (2)通信命令 FX系列PLC有4个通信命令,它们是读命令、写命令、强制通命令、强制断命令,如下表所示。表中X元件;T—定时器;C—计数器;D—数据寄存器。 (3)通信控制字符 FX系列PLC采用面向字符的传输规程,用到5个通信控制字符,如下表所示。

VB上位机与PLC通信

随着现代信息技术的发展以及计算机网络的广泛应用,计算机通信技术已经日趋成熟。作为传统的计算机通信方式的串行通信,由于具有线路简单、应用灵活、可靠性高等一系列优点长期以来获得了广泛的应用。计算机串行通信在数据财经、数据通信、故障检测、计算机远程监控等方面有广泛的实用价值,特别在Windows下的串口通信可以充分利用Windows 下的软件资源优势,实现多任务条件下对外部的数据传输、信息收集和处理。在本系统中,我们采用了性能/价格比较高的计算机构成厂级的监控工作站。在PLC与上位计算机之间采用RS-485和RS-232C标准通信接口进行通信。 在两级计算机控制系统中,最不稳定的环节就是上位机。为了保证系统的稳定性,避免因上位机的故障导致系统控制失灵,所有采集到的信号都反馈到PLC当中。上位机需要通过串行通信取得所需的数据信息,并通过串行通信将必要的控制信息和参数设置信息写入PLC 的数据存储区。因此,串行通信作为上位机和下位机联系的唯一方式,在整个系统中具有非常重要的作用。 1.1上位机与PLC间的串行通信 计算机与计算机或计算机与外部设备之间的数据传输和交换的方式主要有串行通信和并行通信两种方式,其中串行通信指的是数据逐位传输的方式。由于串行通信方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 1.1.1串行通信 串行通信方式又可分为两种:同步串行通信方式和异步串行通信方式。 1.同步串行通信方式:同步串行通信是以数据块(字符块)为信息单位传送,每帧信息可以包含很多字符。同步通信要求通信双方以相同的速率进行,而且要准证确协调,通常通过共

VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码

VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码 本人用的是Modbus RTU通讯模式,通过计算机串口转RS485与外围设备通行通讯,读写外围设备指定地址里的数据,从而达到自动化控制远端设备。 Dim HiByte As Byte Dim LoByte As Byte Dim CRC16Lo As Byte Dim CRC16Hi As Byte Dim ReturnData(1) As Byte Dim K As Integer Dim CmdLenth As Integer Private Sub Command1_Click() K = Text9.Text '写6 个字节 Text13.Text = "" '=========== 数组赋值输入代码=============================================================================== ======== '<< 算法一>> Dim WriteStr() As Byte Dim u As Integer ReDim WriteStr(K + 2) For u = 0 To K WriteStr(u) = Val("&H" & Text1(u).T ext) Next '<< 算法二>> Dim CRC_2() As Byte Dim v As Integer ReDim CRC_2(K) For v = 0 To K CRC_2(v) = Val("&H" & Text1(v).Text) Next '============================================================================== ==================== Call CRC161(CRC_2())

VB与三菱PLC通信

VB与三菱PLC通信 VB源代码下载 https://www.360docs.net/doc/6d16184740.html,/download.action?t=40&k=MTQzOTcxMTM=&pcode=LCw1NTkwMzYsNTU5MDM2&r PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域。实现PC机与PLC通信的目示、动态数据画面显示、报表显示、窗口技术等多种功能,为PLC提供良好的人机界面。本文详在Windows环境下,使用VB6.0开发通信程序,实现了PC机与FX系列PLC之间的协议进行了详细的介绍,并以VB为开发工具实现了PC机与FX系列PLC的串行通信。 1前言 PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域。实现PC机与PLC通信的目示、动态数据画面显示、报表显示、窗口技术等多种功能,为PLC提供良好的人机界面。本文详在Windows环境下,使用VB6.0开发通信程序,实现了PC机与FX系列PLC之间的 2PC机与PLC实现通信的条件 带异步通信适配器的PC机与PLC只有满足如下条件,才能互联通信: (1)带有异步通信接口的PLC才能与带异步通信适配器的PC机互联。还要求双方采用的总线元”变换之后才能互联。 (2)双方的初始化,使波特率、数据位数、停止位数、奇偶校验都相同。 (3)要对PLC的通信协议分析清楚,严格地按照协议的规定及帧格式编写PC机的通信程序。程。 3PC机及与FX系列PLC的串行通讯 3.1硬件连接 PC机与FX系列PLC不能直接连接,要经过FX-232AW单元进行RS232C/RS-接关系: 3.2FX系列PLC的通信协议 在PC机中必须依据互联的PLC的通信协议来编写通信程序,因此先介绍FX系列PLC的通信(1)数据格式 FX系列PLC采用异步格式,由1位起始位、7位数据位、1位偶校验位及1位停止位组成,波I码。

台达PLC与VB通讯简易教程

VB 實現電腦與台達PLC 的串列通信 ───────PLC 產品處 王乃全 摘要:本文介紹了Visual Basic6編程語言,MODBUS ASCII 通信協定及通過VB 如何實現 與台達DVP PLC 的通信 關鍵字:Visual Basic MODBUS ASCII PLC 前言: 現代的世界是一個高度自動化的世界,各式各樣的設備都可以和電腦連線,而最簡單的自動化連線方式就是使用串列通信。 VB 提供了串列通信控制項可以讓開發者開發串列通信的系統程式,功能上也提供了不少為用戶著想的簡便之處。 PLC 是現在控制領域不可缺少的部分,已經非常普及,如何簡便的與PLC 交互已經成為眾多廠商新的競爭戰場。由此產生了人機界面、組態軟體等產品。這些產品的產生大大簡化了對PLC 的控制,操作,使用更方便。但也有共同的缺點:價格過高和開發性較差。VB 作為“原始"的編程語言在這兩方面無疑有著明顯的優勢。 本文結合一個簡單的案例,用比較基礎的概念為大家展示如何通過VB 實現PC-PLC 的通信,對於初涉這個領域的工程師,也會受益與本文提供的基本概念。 一、串列通信基本概念 1、 通信的種類:通常通信的形式可以分為兩種,並行通信(Parallel Communication )和串 列通信(Serial Communication )。所謂並行,既是一次傳輸量為8位;而串列一次只傳1位元。這兩種不同的通信模式如圖 平行傳輸 串列傳輸 2、 串列通信

常用的串列通信也有兩種。分別位RS-232和RS-485 2-1 RS-232 RS-232的信號准位元乃是參考地線而來的,如圖,傳輸端參考接地端1來傳送資料;接收端則參考接地端2還原出傳送端的信號準備。 接地端1 接地端2 由圖可知,由於兩個接地端准位不一定一樣,而且很容易受到干擾,所以信號在RS-232線路傳輸時,很容易產生錯誤。 2-2 RS-485 RS-485的信號傳輸方式如圖。 接地點1 接地點2 RS-485的信號將被傳送出去時會分成正負兩條線路,當到達接收端後,在將信號相減還原成原來的信號;如果將原始的信號表示成(DT),而被分成的信號分別標示成(D+)及(D-),則DT= (D+)-(D-) 同樣地,接收端在接收到信號後,也依據上式還原成原來的樣子。如果線路受到干擾,兩條線路的信號分別為(D+)+Noise (D-)+Noise。接收端還原信號為 (DT)= [(D+)+Noise]-[ (D-)+Noise] 與先前結果一樣,所以RS-485可以有效的防止雜訊的干擾。

vb与plc通讯(以西门子S7-200为例)

vb与plc通讯(以西门子S7-200为例) S7-200 PLC之PPI协议 通过硬件和软件侦听的方法,分析PLC内部固有的PPI通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务。这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程序编写,只需编写上位机的通讯程序资源S7-226的编程口物理层为RS-485结构,SIEMENS提供MicroWin软件,采用的是PPI(Point to Point)协议,可以用来传输、调试PLC程序。在现场应用中,当需要PLC与上位机通讯时,较多的使用自定义协议与上位机通讯。在这种通讯方式中,需要编程者首先定义自己的自由通讯格式,在PLC中编写代码,利用中断方式控制通讯端口的数据收发。采用这种方式,PLC 编程调试较为烦琐,占用PLC的软件中断和代码资源,而且当PLC的通讯口定义为自由通讯口时,PLC的编程软件无法对PLC进行监控,给PLC程序调试带来不便。 SIEMENS S7-200PLC的编程通讯接口,内部固化的通讯协议为PPI协议,如果上位机遵循PPI协议来读写PLC,就可以省略编写PLC的通讯代码。如何获得PPI协议?可以在PLC的编程软件读写PLC数据时,利用第三个串口侦听PLC的通讯数据,或者利用软件方法,截取已经打开且正在通讯的端口的数据,然后归纳总结,解析出PPI协议的数据读写报文。这样,上位机遵循PPI协议,就可以便利的读写PLC内部的数据,实现上位机的人机操作功能。 软件设计 系统中测控任务由SIEMENS S7-226PLC完成,PLC采用循环扫描方式工作,当定时时间到时,执行数据采集或PID控制任务,完成现场的信号控制。计算机的监控软件采用VB编制,利用MSComm控件完成串口数据通讯,通讯遵循的协议为PPI协议。 PPI协议 西门子的PPI(Point to Point)通讯协议采用主从式的通讯方式,一次读写操作的步骤包括:首先上位机发出读写命令,PLC作出接收正确的响应,上位机接到此响应则发出确认申请命令,PLC则完成正确的读写响应,回应给上位机数据。这样收发两次数据,完成一次数据的读写[5]。 其通讯数据报文格式大致有以下几类: 1、读写申请的数据格式如下: SD LE LER SD DA SA FC DASP SSAP DU FCS ED SD:(Start Delimiter)开始定界符(68H) LE:(Length)报文数据长度 LER:(Repeated Length)重复数据长度 SD: (Start Delimiter)开始定界符(68H) SA:(Source Address)源地址,指该地址的指针,为地址值乘以8 DA:(Destination Address)目标地址,指该地址的指针,为地址值乘以8 FC:(Function Code)功能码 DSAP:(Destination Service Access Point)目的服务存取点 SSAP:(Source Service Access Point)源服务存取点 DU:(Data Unit)数据单元 FCS:(Frame Check Sequence)校验码 ED:(End Delimiter)结束分界符(16H) 报文数据长度和重复数据长度为自DA至DU的数据长度,校验码为DA至DU数据的和校

VB开发OPC与PLC通信

VB开发WinCC的OPC客户机实例 组态 2009-07-03 19:52 阅读101 评论0 字号:大中小 VB开发WinCC的OPC客户机实例 发布时间:2006.04.29 阅览次数:1804 作者:林启宽单位:厦门市海沧新阳工业区厦门卷烟厂 关键词:OPC VB6.0 WinCC上位机 WinCC是西门子公司在自动化领域采用最先进的技术与微软公司在共同开发的居于世界领先地位的工控软件。WinCC即WINDOWS CONTROL CENTER(视窗控制中心)。WinCC是一个功能强大的全面开放的监控系统,既可以用来完成小规模的简单的过程监控应用,也可以用来完成复杂的应用。在任何情况下WinCC都可以生成漂亮而便捷的人机对话接口,使操作员能够清晰地管理和优化生产过程。它集成的OPC(OLE for process control)服务器使得过程数据可由其它应用程序(OPC客户机)访问。 WinCC在安装时提供了OPC的客户端控件: Siemens OPC DAAutomation 2.0( SOPCDAAuto.dll), 在WINCC的帮助中,有Siemens OPC DAAutomation 2.0使用的简略帮助,但说得不很详细,我在使用VB6.0开发WinCC的OPC客户机中碰到不少问题,现一并写出来,与大家共享。希望起到抛砖引玉,举一反三的作用。 一、开发实例背景:我厂包装机BE电气改造后,由原来了单片机、直流调试板、温度控制板等控制改为带有通讯端口PLC、变频器、温控仪等控制,上位机监控软件为WinCC。在控制系统中,变频器、温控仪的控制信号通过串口、OPC客户机接入上位机WinCC,报警信号接入PLC。其硬件组态结构如图一 OPC开发要求:①通过WinCC建立内部变量Tag(1),Tag(2),Tag(3),Tag(4)……;在视图窗口建立相应了I/O输入输出域。通过更改WinCC中I/O域的值,来设定或更改变频器、温控仪等的参数。②通过VB开发了串口驱动程序,读取变频器、温控仪等的参数,通过OPC控件把值传递给WinCC中的I/O域。 二、VB6开发WinCC的OPC客户机具体步骤: 1、打开VB6,建立如图二窗体: 其中,文本框组Text4.text为写入WinCC内部变量名称;文本框组Text5.text为显示相应了WinCC内

上位机VB实现与三菱PLC的串行通讯

上位机V B实现与三菱P L C的串行通讯 Document serial number【KK89K-LLS98YT-SS8CB-SSUT-SST108】

上位机V B实现与三菱P L C的串行通讯 2009年12月15日星期二下午07:40 1.通行原理与方法 上位机要能够通过PLC监控下层设备的状态,就要实现上位机与PLC间的通信,一般工业控制中都是采用RS232 C实现。上位机首先向PLC发送查询数据的指令(实际上是查询PLC中端子的状态和DM区的值等),PLC接收了上 位的指令后,进行校验(FCS校验码),看其是否正确,如果正确,则向上位机传送数据(包含首尾校验字节)。否 则,PLC拒绝向上位机传送数据。上位接收到PLC传送的数据,也要判断正确与否,如果正确,则接收,否则, 拒绝接收。 由于CPM1A没有提供串行通信口,我们利用其提供的外设端口实现通信。PLC与计算机之间的 连接是通过OMRON提供的专用电缆CQM1-CIF01来实现的,其硬件连接图如图1所示。(见附图) 2.PLC与计算机间的通信规约 计算机与PLC间的通信是以“帧”为单位进行的,并且在通信的过程中,计算机具有更高的优先级。首先,计算 机向PLC发出命令帧,然后,PLC作出响应,向计算机发送回响应帧。其中命令帧和响应帧的格式如下: (1)命令帧格式。为了方便计算机和PLC的通讯,CPM1A对在计算机连接通信中交换的命令和响应规定了相应的 格式。当计算机发送一个命令时,命令数据主准备格式如图2所示。(见附图) 其中@放在首位,表示以@开始,设备号为上位机识别所连接的PLC的设备号。识别码为命令代码,用来设置用户 希望上位机完成的操作,FCS为帧检验代码,一旦通信出错,通过计算FCS可以及时发现。结束符为“*”和CR 回车符,表示命令结束。 (2)响应帧格式。由PLC发出的对应于命令格式的响应帧格式如图3所示。(见附图) 其中,异常码可以确定计算机发送的命令是否正确执行。其它的与正文中的含义相同。正文仅在有读出数据时有 返回。 3.通信程序的设计 为了充分利用计算机数据处理的强大功能,我们可以采用计算机有优先权的方式,在计算机上编写程序来实现计 算机与PLC的通信,计算机向PLC发出命令发起通信,PLC自动返回响应。本文中采用VB来编写计算机与PLC 间的通讯程序。在VB中提供了通信控件—应用通信控件(MSCOMM),实现通过串行端口传送和接受的功能。 下面介绍MSCOMM控件的属性: *CommPort:设定通信连接端口代号,程序必须指定所要使用的串行端口号,Windows系统使用所设定的端口与外 界通信。 *PortOpen:设定通信口状态,若为真,通信端口打开,否则关闭。 *Settings:设定通信口参数,其格式是"bbbb,p ,d,s",其中bbbb为通信速率(波特率),p为通信检查方式(奇偶校验),d为数据位数,s为停止位数,其设定 应与PLC的设定一致。 *Input:将对方传送至输入缓冲区的字符读入到程序。 *Output:将字符写入输出缓冲区。 *InBufferCount:传回接收缓冲区中的字符数。 *OutBufferCount:传回输出缓冲区中的字符数。 *InputLen:设定串行端口读入字符串的长度。 *InputMode:设定接收数据的方式。 *Rthreshold:设定引发接收事件的字符数。 *CommEvent:传回OnComm事件发生时的数值码 *OnComm事件:无论是错误或事件发生,都会触发此事件。 (1)控件参数的初始化。 初始化程序如下: https://www.360docs.net/doc/6d16184740.html,Port=2'使用串口Com2 Mscomm.Settings="9600,E,7,2"'波特率9600,偶校验,7位数据位,2位停止位 Mscomm.PortOpen=True'打开通信端口,准备通信 (2)计算校验码FCS,计算FCS的VB自定义函数如下: FunctionFCS(ByValInputStrAsString)AsString DimSlen,i,XorresultAsInteger DimTempfesAsString

vb与三菱PLC的通信详解概要

Vb6.0与三菱PLC的通信 串行通信程序时,有两种方法,一种是用Windows API函数,另一种是用VB支持的通信控件MSCOMM.OCX。使用MSCOMM.OCX控件编程方便,具有更完善的发送和接收功能。这里采用了MSCOMM.OCX控件。 项目选用三菱FX2N-64MR型PLC,SC-09电缆作为计算机与PLC通信的连线。连接电缆的9针端连接在计算机串口上,另一端连接在PLC的RS-422编程口。 通信格式: 一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码—ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX(CHR(2))和ETX(CHR(3))分别表示该字符帧的起始标起和结束标志。 (1) 起始字元STX:ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。 (2) 命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。 (3) 元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。 (4) 元件个数:一次读取位元件或字元件的数量。 (5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束。 (6) 校验码(Checksum):校验码是将STX-ETX之间的ASCII字元的16进制数值以“LRC(Longitudinal Redunda ncy Check)”法计算出1个Byte长度(两个16进制数值00-FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。 FX2系列与计算机之间的通信是以主机发出的初始命令,PLC对其做出回答响应进行通信的,PLC无权命令。 三菱FX系列PLC编程口通信协议总览 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。通讯格式: 传输格式: RS232C波特率:9600bps奇偶even校验:累加方式(和校验)字符: ASCII16进制代码:

VB与西门子S7 200 PPI协议通讯

VB与西门子S7 200 PPI协议通讯 通过硬件和软件侦听的方法,分析PLC内部固有的PPI 通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务。这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程序编写,只需编写上位机的通讯程序资源 S7-226的编程口物理层为RS-485结构,SIEMENS提供MicroWin软件,采用的是PPI(Point to Point)协议,可以用来传输、调试PLC程序。在现场应用中,当需要PLC与上位机通讯时,较多的使用自定义协议与上位机通讯。在这种通讯方式中,需要编程者首先定义自己的自由通讯格式,在PLC 中编写代码,利用中断方式控制通讯端口的数据收发。采用这种方式,PLC编程调试较为烦琐,占用PLC的软件中断和代码资源,而且当PLC的通讯口定义为自由通讯口时,PLC 的编程软件无法对PLC进行监控,给PLC程序调试带来不便。 SIEMENS S7-200PLC的编程通讯接口,内部固化的通讯协议为PPI协议,如果上位机遵循PPI协议来读写PLC,就可以省略编写PLC的通讯代码。如何获得PPI协议?可以在PLC的编程软件读写PLC数据时,利用第三个串口侦听PLC的通讯数据,或者利用软件方法,截取已经打开且正在通讯的端口的数据,然后归纳总结,解析出PPI协议的数据

读写报文。这样,上位机遵循PPI协议,就可以便利的读写PLC内部的数据,实现上位机的人机操作功能。 软件设计 系统中测控任务由SIEMENS S7-226PLC完成,PLC采用循环扫描方式工作,当定时时间到时,执行数据采集或PID控制任务,完成现场的信号控制。计算机的监控软件采用VB 编制,利用MSComm控件完成串口数据通讯,通讯遵循的协议为PPI协议。 PPI协议 西门子的PPI(Point to Point)通讯协议采用主从式的通讯方式,一次读写操作的步骤包括:首先上位机发出读写命令,PLC作出接收正确的响应,上位机接到此响应则发出确认申请命令,PLC则完成正确的读写响应,回应给上位机数据。这样收发两次数据,完成一次数据的读写[5]。 其通讯数据报文格式大致有以下几类: 1、读写申请的数据格式如下: SD LE LER SD DA SA FC DASP SSAP DU FCS ED SD:(Start Delimiter)开始定界符(68H) LE:(Length)报文数据长度 LER:(Repeated Length)重复数据长度 SD: (Start Delimiter)开始定界符(68H) SA:(Source Address)源地址,指该地址的指针,为地址值

相关主题
相关文档
最新文档