首页 S7-200自由口通讯程序方式C

S7-200自由口通讯程序方式C

举报
开通vip

S7-200自由口通讯程序方式CS7-200自由口通讯程序方式C 说明,这个例子的PLC程序也是从别处借来,本人只是适当作了修理,另再写了VB的代码部分。个为认为PLC程序写得不错,因为程序太长,请各位心看了。 //^^^^^^^^^^^^^^^^^^^^^^// PLC程序部分 TITLE=程序注释 //PLC在第一次扫描时执行初始化子程序,对端口及RCV指令进行初始化。初始化完成后,运行RCV指令使端口处于接受状态。 //RCV会将以"g"开头"G"结尾的指令保存到接收缓冲区,并同时产生接收完成中断。 //RCVcomplete...

S7-200自由口通讯程序方式C
S7-200自由口通讯程序方式C 说明,这个例子的PLC程序也是从别处借来,本人只是适当作了修理,另再写了VB的代码部分。个为认为PLC程序写得不错,因为程序太长,请各位心看了。 //^^^^^^^^^^^^^^^^^^^^^^// PLC程序部分 TITLE=程序注释 //PLC在第一次扫描时执行初始化子程序,对端口及RCV指令进行初始化。初始化完成后,运行RCV指令使端口处于接受状态。 //RCV会将以"g"开头"G"结尾的指令保存到接收缓冲区,并同时产生接收完成中断。 //RCVcomplete中断服务程序用来处理接收完成中断事件,它会将接收缓冲区中的十六进制ASCII码还原成数据并保存,同时置位Verify子程序的触发条件(M0.1)。 // Verify子程序首先复位本身的触发条件以防止子程序被重复调用,然后求出接收缓冲区中指令的BCC校验码并与指令中的BCC校验码进行比对。如果相等则置BCC码校验正确的标志位(M0.0)为1;如果指令格式正确(指令的结束标志在接收缓冲区中特定的位置VB133)而BCC码不相等,则发送代表BCC校验码错误的反馈信息;如果指令格式不正确(VB133中不是指令的结束标志),则返回代表指令格式错误的反馈信息。 // Read子程序的触发条件为:指令中的站地址与本机站地址相符、指令类型为读指令、BCC检验码正确。当条件满足时,Read子程序被执行。Read子程序首先禁止RCV,然后将指令所要读取的数据转换成十六进制ASCII码并写入发送缓冲区、计算BCC检验码、最后发送反馈信息。 // Write子程序的触发条件为:指令中的站地址与本机站地址相符、指令类型为写指令、BCC检验码正确。当条件满足时,Write子程序被执行。Write子程序首先禁止RCV,然后将指令中的数据写入目标寄存器,最后发送代表写入正确的反馈信息。 //PLC每接到一条指令后都会发送一条反馈信息,当反馈信息发送完成时,会产生发送完成中断,XMTcomplete中断服务程序用来处理发送完成中断事件。在XMTcomplete中断服务程序中所要执行的操作包括:复位BCC校验码正确的标志位(M0.0);允许RCV;bcc码寄存器清零;重新装入用于计算BCC校验码的地址指针;接收缓冲区中存放指令结束字符的字节VB133清零(用来判断下一条指令格式是否正确)。 Network 1 LD SM0.1 //第一次扫描调用初始化子程序 CALL SBR0 Network 2 LDB= VB134, VB199 //指令中的站地址与本机站地址相符 AB= VB102, 5 //指令类型为读指令 A M0.0 //BCC码校验正确 CALL SBR1 //调用读子程序 Network 3 LDB= VB134, VB199 //指令中的站地址与本机站地址相符 AB= VB102, 6 //指令类型为写指令 A M0.0 //BCC码校验正确 CALL SBR2 //调用写子程序 Network 4 LD M0.1 //指令接收完成后调用BCC码校验子程序 CALL SBR3 Network 5 LD SM4.5 //当端口空闲时启动RCV RCV VB100, 0 Network 6 LD SM0.0 MOVW AIW0, VW300 /I +50, VW300 MOVW AIW2, VW302 /I +50, VW302 MOVW AIW4, VW304 /I +50, VW304 MOVW AIW6, VW306 /I +50, VW306 Network 7 LD SM0.0 = Q0.0 Network 8 LD I0.0 = Q0.1 TITLE=子程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 MOVB 9, SMB30 //0口"9600,N,8,1" Network 2 LD SM0.0 //RCV指令初始化 MOVB 16#EC, SMB87 MOVB 103, SMB88 MOVB 71, SMB89 MOVB 100, SMB92 MOVB 35, SMB94 R SM87.2, 1 Network 3 LD SM0.0 ATCH INT0, 23 //连接口0接收完成的中断 Network 4 LD SM0.0 连接口0发送完成的中断 ATCH INT1, 9 // Network 5 LD SM0.0 ENI //中断允许 Network 6 LD SM0.0 MOVB 2, VB199 //将本机站地址装入寄存器 Network 7 LD SM0.0 MOVD &VB102, VD149 //装入地址指针 MOVB 0, VB179 //BCC码寄存器清零 MOVD &VB156, VD181 //装入地址指针 MOVB 0, VB180 //BCC码寄存器清零 TITLE=子程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 //停止端口0的接收 R SM87.7, 1 R M0.0, 1 RCV VB100, 0 Network 2 LD SM0.0 //将数据写入发送缓冲区 MOVB 103, VB154 MOVB 1, VB155 HTA *VD135, VB156, 16 MOVB 26, VB174 MOVB 21, VB153 Network 3 LD SM0.0 //计算BCC校验码 FOR VW177, +1, +16 Network 4 LD SM0.0 XORB *VD181, VB180 Network 5 LD SM0.0 INCD VD181 Network 6 NEXT Network 7 LD SM0.0 HTA VB180, VB172, 2 //BCC校验码写入发送缓冲区 Network 8 LD SM4.5 //发送反馈信息 XMT VB153, 0 TITLE=子程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 //停止端口0的接收 R SM87.7, 1 R M0.0, 1 RCV VB100, 0 Network 2 LD SM0.0 //装入要写如数据源的地址指针 MOVD &VB115, VD145 Network 3 LD SM0.0 //写入数据 ATH *VD145, *VD135, VB139 Network 4 LD SM0.0 //指令执行的反馈信息写入发送缓冲区 MOVB 21, VB153 MOVB 103, VB154 MOVB 2, VB155 MOVB 26, VB174 Network 5 LD SM4.5 //发送指令执行的反馈信息 XMT VB153, 0 TITLE=子程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 R M0.1, 1 //复位verify子程序的执行条件 Network 2 LD SM0.0 //计算BCC码 FOR VW175, +1, +29 Network 3 SM0.0 LD XORB *VD149, VB179 Network 4 LD SM0.0 INCD VD149 Network 5 NEXT Network 6 LDB= VB179, VB140 //当BCC码校验正确时,M0.0置1 AB= VB133, 71 S M0.0, 1 Network 7 LDB= VB133, 71 //BCC码错误时发送反馈信息 AB<> VB179, VB140 MOVB 21, VB153 MOVB 103, VB154 MOVB 3, VB155 MOVB 26, VB174 R SM87.7, 1 RCV VB100, 0 XMT VB153, 0 Network 8 LDB<> VB133, 71 //指令格式错误或RCV超时时发送反馈信息 MOVB 21, VB153 MOVB 103, VB154 MOVB 4, VB155 MOVB 26, VB174 R SM87.7, 1 RCV VB100, 0 XMT VB153, 0 TITLE=中断程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 ATH VB103, VB134, 2 //指令译码(ASCII码到十六进制) ATH VB105, VB135, 8 ATH VB113, VB139, 2 ATH VB131, VB140, 2 S M0.1, 1 //置位Verify子程序的触发条件 MOVB 0, VB179 //BCC码寄存器清零 MOVD &VB102, VD149 //装入地址指针 TITLE=中断程序注释 Network 1 // 网络标题 // 网络注释 LD SM0.0 R M0.0, 1 //复位BCC校验码正确的标志位 1 //允许口0进行接收 S SM87.7, MOVB 0, VB179 //BCC校验码寄存器清零 MOVB 0, VB180 //BCC校验码寄存器清零 MOVD &VB102, VD149 //重新装入地址指针 MOVD &VB156, VD181 MOVB 0, VB133 //接收缓冲区中存放指令结束字符的字节清零 /…………………………/ VB源码部分 Option Explicit Private Declare Function GetTickCount Lib "kernel32" () As Long Dim x1 Dim p11, p12, p13, p14, p15, p16, p17, p18 Dim p21, p22, p23, p24, p25, p26, p27, p28 Dim a11, b11, c11, d11 Dim p31, p32, p33, p34, p35, p36, p37, p38 Dim i00, i01, q00, q01 Function FCS(ByVal InputStr As String) As String Dim Slen, i, Xorresult As Integer Dim Tempfes As String Slen = Len(InputStr) '求输入字符串长度 Xorresult = 0 For i = 1 To Slen Xorresult = Xorresult Xor Asc(Mid$(InputStr, i, 1)) '按位异或 Next i Tempfes = Hex$(Xorresult) '转化为16进制 If Len(Tempfes) = 1 Then Tempfes = "0" + Tempfes FCS = Tempfes End Function Private Sub About_Click() frmAbout.Show End Sub Private Sub Form_Load() '初始化 Timer1.Enabled = False '定时器1无效 Timer1.Interval = 1000 '定时器1时间为1S Timer2.Enabled = True '定时器2有效 Timer2.Interval = 1000 '定时器2时间为1S Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = "" Text6.Text = "" Text8.Text = "" Text10.Text = "" MSComm1.CommPort = 1 '设定端口号 MSComm1.Settings = "9600,n,8,1" '设定通讯波特率 MSComm1.InBufferSize = 1024 '接收缓冲器大小 MSComm1.OutBufferSize = 1024 '输出缓冲器大小 MSComm1.InputMode = comInputModeBinary '以二进制传输 MSComm1.RThreshold = 21 ' MSComm1.SThreshold = 0 MSComm1.InputLen = 0 '读取接收缓冲器所有字符 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.InBufferCount = 0 '清空接收缓冲区 If MSComm1.PortOpen = False Then Command3.Caption = "打开串口" Else Command3.Caption = "关闭串口" End If End Sub Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() '退出程序,定时器1无效 Timer1.Enabled = False Cls Unload Me End Sub Private Sub Command3_Click() On Error Resume Next = False Then If MSComm1.PortOpen MSComm1.PortOpen = True Else MSComm1.PortOpen = False End If If MSComm1.PortOpen Then '打开关闭按钮显示文字 Command3.Caption = "关闭串口" Else Command3.Caption = "打开串口" End If If Err Then '打开串口失败,则显示出错信息 MsgBox Error$, 48, "错误信息" Exit Sub End If End Sub Private Sub Timer1_Timer() '读V存储区数据 Dim Tempfes As String Dim aa(32) As Byte '定义动态数组 aa(0) = &H67 aa(1) = &H5 aa(2) = &H30 aa(3) = &H32 aa(4) = &H30 aa(5) = &H38 aa(6) = &H30 aa(7) = &H30 aa(8) = &H30 aa(9) = &H31 aa(10) = &H32 aa(11) = &H43 aa(12) = &H31 aa(13) = &H30 aa(14) = &H30 aa(15) = &H30 aa(16) = &H30 aa(17) = &H30 aa(18) = &H30 aa(19) = &H30 aa(20) = &H30 aa(21) = &H30 aa(22) = &H30 aa(23) = &H30 aa(24) = &H30 aa(25) = &H30 aa(26) = &H30 aa(27) = &H30 aa(28) = &H30 aa(29) = &H30 aa(30) = &H37 aa(31) = &H45 aa(32) = &H47 MSComm1.OutBufferCount = 0 '清空输出寄存器 MSComm1.Output = aa End Sub Private Sub Command4_Click() '读I状态 Dim FGetData As String Dim Tempfes As String Dim aa(32) As Byte '定义动态数组 aa(0) = &H67 aa(1) = &H5 aa(2) = &H30 aa(3) = &H32 aa(4) = &H30 aa(5) = &H30 aa(6) = &H30 aa(7) = &H30 aa(8) = &H30 aa(9) = &H30 aa(10) = &H30 aa(11) = &H30 aa(12) = &H31 aa(13) = &H30 aa(14) = &H30 aa(15) = &H30 aa(16) = &H30 aa(17) = &H30 aa(18) = &H30 aa(19) = &H30 aa(20) = &H30 aa(21) = &H30 aa(22) = &H30 aa(23) = &H30 aa(24) = &H30 aa(25) = &H30 aa(26) = &H30 aa(27) = &H30 aa(28) = &H30 aa(29) = &H30 aa(30) = &H30 aa(31) = &H36 aa(32) = &H47 MSComm1.OutBufferCount = 0 '清空输出寄存器 MSComm1.Output = aa FGetData = IReceiveData p31 = Chr(Val("&H" & (Mid(FGetData, 5, 2)))) p32 = Chr(Val("&H" & Mid(FGetData, 7, 2))) p33 = Chr(Val("&H" & Mid(FGetData, 9, 2))) p34 = Chr(Val("&H" & Mid(FGetData, 11, 2))) i00 = p31 + p32 i01 = p33 + p32 End Sub Private Sub Command5_Click() '读Q状态 Dim FGetData As String Dim Tempfes As String Dim aa(32) As Byte '定义动态数组 aa(0) = &H67 aa(1) = &H5 aa(2) = &H30 aa(3) = &H32 aa(4) = &H30 aa(5) = &H31 aa(6) = &H30 aa(7) = &H30 aa(8) = &H30 aa(9) = &H30 aa(10) = &H30 aa(11) = &H30 aa(12) = &H31 aa(13) = &H30 aa(14) = &H30 aa(15) = &H30 aa(16) = &H30 aa(17) = &H30 aa(18) = &H30 aa(19) = &H30 aa(20) = &H30 aa(21) = &H30 aa(22) = &H30 aa(23) = &H30 aa(24) = &H30 aa(25) = &H30 aa(26) = &H30 aa(27) = &H30 aa(28) = &H30 aa(29) = &H30 aa(30) = &H30 aa(31) = &H37 aa(32) = &H47 MSComm1.OutBufferCount = 0 '清空输出寄存器 MSComm1.Output = aa FGetData = QReceiveData p35 = Chr(Val("&H" & (Mid(FGetData, 5, 2)))) p36 = Chr(Val("&H" & Mid(FGetData, 7, 2))) p37 = Chr(Val("&H" & Mid(FGetData, 9, 2))) p38 = Chr(Val("&H" & Mid(FGetData, 11, 2))) q00 = p35 + p36 q01 = p37 + p36 End Sub Private Sub MSComm1_OnComm() '接收数据 Dim i%, buf$ Dim hexdisp As String Dim inByte() As Byte Dim tmp As Variant '很重要 buf = " " Select Case MSComm1.CommEvent Case comEvReceive '有接受事件发生 tmp = MSComm1.Input inByte = tmp '接收二进制数据 For i = LBound(inByte) To UBound(inByte) buf = buf + Hex(inByte(i)) Next i hexdisp = hexdisp + buf Text5.Text = hexdisp p11 = Chr(Val("&H" & (Mid(hexdisp, 5, 2)))) p12 = Chr(Val("&H" & Mid(hexdisp, 7, 2))) p13 = Chr(Val("&H" & Mid(hexdisp, 9, 2))) p14 = Chr(Val("&H" & Mid(hexdisp, 11, 2))) p15 = Chr(Val("&H" & (Mid(hexdisp, 13, 2)))) p16 = Chr(Val("&H" & Mid(hexdisp, 15, 2))) p17 = Chr(Val("&H" & Mid(hexdisp, 17, 2))) p18 = Chr(Val("&H" & Mid(hexdisp, 19, 2))) p21 = Chr(Val("&H" & (Mid(hexdisp, 21, 2)))) p22 = Chr(Val("&H" & Mid(hexdisp, 23, 2))) p23 = Chr(Val("&H" & Mid(hexdisp, 25, 2))) p24 = Chr(Val("&H" & Mid(hexdisp, 27, 2))) p25 = Chr(Val("&H" & (Mid(hexdisp, 29, 2)))) p26 = Chr(Val("&H" & Mid(hexdisp, 31, 2))) p27 = Chr(Val("&H" & Mid(hexdisp, 33, 2))) p28 = Chr(Val("&H" & Mid(hexdisp, 35, 2))) a11 = p11 + p12 + p13 + p14 b11 = p15 + p16 + p17 + p18 c11 = p21 + p22 + p23 + p24 d11 = p25 + p26 + p27 + p28 End Select End Sub Private Function IReceiveData() As String '数据发出去以后就调用此函数 Dim FGetData As String Dim t1 As Long Dim av As Variant Dim i As Integer Dim ReDataLen As Integer FGetData = "" t1 = GetTickCount() '取时间,做延时用 Do '循环等待接收数据 DoEvents If MSComm1.InBufferCount > 0 Then '串口有数据了 ReDataLen = MSComm1.InBufferCount '取数据长度 av = MSComm1.Input '将串口数据取出来 For i = 0 To ReDataLen - 1 FGetData = FGetData & Right("00" & Hex(av(i)), 2) Next i End If If Len(FGetData) >= 6 Then If Len(FGetData) > 19 Then IReceiveData = FGetData Exit Function End If End If If GetTickCount - t1 > 2000 Then '2秒没收完就不收了 IReceiveData = "" Exit Function End If Loop End Function Private Function QReceiveData() As String '数据发出去以后就调用此函数 Dim FGetData As String Dim t1 As Long Dim av As Variant Dim i As Integer Dim ReDataLen As Integer FGetData = "" t1 = GetTickCount() '取时间,做延时用 Do '循环等待接收数据 DoEvents If MSComm1.InBufferCount > 0 Then '串口有数据了 ReDataLen = MSComm1.InBufferCount '取数据长度 av = MSComm1.Input '将串口数据取出来 For i = 0 To ReDataLen - 1 FGetData = FGetData & Right("00" & Hex(av(i)), 2) Next i End If If Len(FGetData) >= 6 Then If Len(FGetData) > 19 Then QReceiveData = FGetData Exit Function End If End If If GetTickCount - t1 > 2000 Then '2秒没收完就不收了 QReceiveData = "" Exit Function End If Loop End Function Private Sub Timer2_Timer() x1 = x1 + 1 Text10.Text = x1 Text1.Text = Val("&H" & (a11)) Text2.Text = Val("&H" & (b11)) Text3.Text = Val("&H" & (c11)) Text4.Text = Val("&H" & (d11)) Text7.Text = Val("&H" & (q00)) Then Text7.BackColor = RGB(255, 0, 255) If Text7.Text = 1 If Text7.Text = 0 Then Text7.BackColor = RGB(0, 255, 255) Text6.Text = Val("&H" & (q01)) If Text6.Text = 1 Then Text6.BackColor = RGB(255, 0, 255) If Text6.Text = 0 Then Text6.BackColor = RGB(0, 255, 255) Text9.Text = Val("&H" & (i00)) If Text9.Text = 1 Then Text9.BackColor = RGB(255, 0, 255) If Text9.Text = 0 Then Text9.BackColor = RGB(0, 255, 255) Text8.Text = Val("&H" & (i01)) If Text8.Text = 1 Then Text8.BackColor = RGB(255, 0, 255) If Text8.Text = 0 Then Text8.BackColor = RGB(0, 255, 255) End Sub
本文档为【S7-200自由口通讯程序方式C】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_713593
暂无简介~
格式:doc
大小:51KB
软件:Word
页数:25
分类:企业经营
上传时间:2017-09-30
浏览量:25