会员登陆会员注册论坛菜单论坛样式查看帮助

东莞自动化论坛
  你的位置:东莞自动化论坛 → 工业自动化 → 浏览帖子:VB6与三菱FX PLC 编程口通讯(遍历读FX-PLC的映...
VB6与三菱FX PLC 编程口通讯(遍历读FX-PLC的映象区)...--东莞自动化论坛--工控论坛|www.dgzdh.com
发表一个新主题 开启一个新投票 回复些主题 你是本帖的第 9514 位阅读者
 『 帖子主题 』:VB6与三菱FX PLC 编程口通讯(遍历读FX-PLC的映象区)...

耕心


帮派:工业自动化
金钱:146430
经验:9335
魅力:34557
帖数:314


『 管理员 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用楼   顶

VB6与三菱FX PLC 编程口通讯(遍历读FX-PLC的映象区)


'操作状态CommExit: 0=通讯进行状态,>1=通讯被打断
'通讯状态CommEnd:0=开始发送和等待接收,>1:接收串已结束

'CommError=通讯出错计数
'FxAddress=PLC映象地址计数

'FxString=存放每次PLC返回的应答串
'ErrStr=每串操作的结果提示,"OK" 或 "ERR"
'RowCo1=每次操作结果放在电子表格的填充区域

Public CommExit%, CommEnd%
Public CommError&, FxAddress&
Public FxString$, ErrStr$, RowCo1$

'将CommandButton1改名为Beginning,开始测试
Private Sub Beginning_Click()
Dim c As Range
Dim m1, m2
Dim s$, s1$, MaxLen&

On Error GoTo err1
CommPortOpen 1 '设置串口参数和打开端口
CommExit = 0
CommError = 0
Range("A1") = ""
Range(RowCo1) = ""
FxAddress = 0
RowCo1 = "a2:p257" '操作结果填写在表格的区域
MaxLen = 16 '每次读PLC映象的字节数
'遍历读FX-PLC映象区
For Each c In Range(RowCo1)
'命令串转换
s = "0" & Right("000" & Hex(FxAddress), 4) & Hex(MaxLen)
'指示正在读入的区域
c = Right("000" & Hex(FxAddress), 4) & ":"
'清接收区残余数据,和发命令
s1 = MSComm1.Input
MSComm1.Output = FxChar(s)

FxString = "" '清接收区
CommEnd = 0 '置发送状态
c.Select '焦点指向当前单元格

m1 = Timer + 2 '限定等待时间2秒,超出后转出错并结束
Do While CommExit = 0
m2 = Timer
If m2 > m1 Then
MsgBox "通讯线路出错!请检查线路...", vbCritical
MSComm1.PortOpen = False
Exit Sub
End If
DoEvents '交出VB事件处理控制权
Loop

'通讯被人工打断
If CommExit > 1 Then
MsgBox "通讯被取消...", vbExclamation
MSComm1.PortOpen = False
Exit Sub
End If
DoEvents '交出VB事件处理控制权
WriteData (FxAddress) '数据写入"PLC数据"工作表
c = c & ErrStr '给出本轮通讯结果状态
FxAddress = FxAddress + MaxLen '映象地址迁移
If FxAddress > &HFFFF& Then
MsgBox "读入工作全部完成!", vbExclamation
Exit For
End If
DoEvents '交出VB事件处理控制权
Next
MSComm1.PortOpen = False
err1:
End Sub

'将CommandButton2改名为CancelB,打断正在进行的通讯
Private Sub CancelB_Click()
CommExit = 3
End Sub

'在串口中断中接收PLC返回的字串
Private Sub MSComm1_OnComm()
Dim s
Select Case MSComm1.CommEvent
Case comEvReceive
s = MSComm1.Input
Select Case s
Case Chr(6)
CommEnd = 3
Case Chr(21)
CommEnd = 100
End Select
FxString = FxString & s
If Len(FxString) >= 3 Then
If Asc(Right(FxString, 3)) = 3 Then
CommEnd = 5
End If
End If
If CommEnd > 2 Then
If CommEnd = 5 Then
ErrStr = "OK"
Else
ErrStr = "ERR"
CommError = CommError + 1
Range("a1") = "出错计数:" & CommError
End If
CommExit = 1
End If
End Select
End Sub

'将PLC每次返回的数据填写在"PLC数据"工作表里
Private Sub WriteData(n As Long)
Dim i&, j&
Dim s$
Static Row1%, Col1%
With Worksheets("PLC数据")
If n = 0 Then
Row1 = 2
Col1 = 0
.Range(RowCo1) = ""
End If
.Range(Chr(&H61 + Col1) & Row1) = Right("000" & Hex(n), 4) _
& ":" & FxString
If Chr(&H61 + Col1) = "p" Then
Col1 = 0
Row1 = Row1 + 1
Else
Col1 = Col1 + 1
End If
FxString = ""
CommExit = 0
End With
End Sub


'将要发向PLC的命令字串组合:加起始符02h和结束符03h,及累加校验和,返回给调用者
Private Function FxChar$(s$)
Dim m%, n%
Dim s1$
s1 = UCase(s)
For m = 1 To Len(s1)
n = n + Asc(Mid(s1, m, 1))
Next
n = n + 3
FxChar = Chr(2) & s1 & Chr(3) & Right(Hex(n), 2)
End Function

'设置通讯口参数后,打开通讯口
Private Sub CommPortOpen(Port%)
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
MSComm1.CommPort = Port
MSComm1.Settings = "9600,e,7,1"
MSComm1.RTSEnable = True
MSComm1.InputMode = comInputModeText
MSComm1.SThreshold = 1
MSComm1.PortOpen = True
End Sub

如果仅相要PLC数据包中的有效数据,Private Sub MSComm1_OnComm()中接收可改为:
=======================================================

'在串口中断中接收FX-PLC返回的字串:仅截取有用数据
Private Sub MSComm1_OnComm()
Dim s
Select Case MSComm1.CommEvent
Case comEvReceive
s = MSComm1.Input
Select Case s
Case Chr(2) '串起始码
Case Chr(6), Chr(21) '单应答码和出错码
CommEnd = s
Case Chr(3) '串结束码
CommEnd = 1
Case Else
If CommEnd Then
Select Case CommEnd
Case 1 To 3 '串结束码到后,再等两个校验和码
CommEnd = CommEnd + 1
Case 4 To 6 '正常结束
ErrStr = "OK"
CommExit = 1
Case Is > 6 '出错结束
ErrStr = "ERR"
CommError = CommError + 1
Range("a1") = "出错计数:" & CommError
CommExit = 1
End Select
Else
FxString = FxString & s '仅串接有效数据
End If
End Select
End Select
End Sub


————————————————————
欢迎光临东莞自动化网!
http://www.dgzdh.com
状态:
2007-01-16 23:09:18 帖子管理:总置顶置顶精华加锁删除移动

angzi


帮派:工业自动化
金钱:1050
经验:208
魅力:208
帖数:3

『 新手上路 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用A 栋 9 楼

                


感谢 楼主的无私奉献


————————————————————
学无止境
状态:
2007-07-01 10:59:27删除

plcj


帮派:自动化
金钱:1050
经验:208
魅力:208
帖数:36

『 新手上路 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用A 栋 8 楼

                


————————————————————
东莞自动化网
http://hi.baidu.com/plcjm8
状态:
2007-07-02 22:29:14删除

hzx1941


帮派:自动化
金钱:1250
经验:240
魅力:240
帖数:15

『 新手上路 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用A 栋 7 楼

                


谢谢了


————————————————————
东莞自动化网
http://www.dgzdh.com
状态:
2007-07-17 08:50:59删除

wenqqt


帮派:工控
金钱:1050
经验:208
魅力:208
帖数:4

『 新手上路 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用A 栋 6 楼

                


0K


————————————————————
东莞自动化网
http://www.dgzdh.com
狮子的吼出来的!~~~~~~
状态:
2007-11-21 10:46:42删除

llx


帮派:自动化
金钱:1400
经验:264
魅力:264
帖数:19

『 新手上路 』
  信 息  留 言  OICQ  邮 箱  主 页  编 辑   引 用A 栋 5 楼

                


谢谢楼主


————————————————————
东莞自动化网
http://www.dgzdh.com
状态:
2007-12-07 09:25:45删除
共有 1 页, 5 张回复帖,每页有 10 张贴子 >> [ 1 ]
页码:
  快 速 回 复

用户信息:

用户名: 没有注册?密码: 忘记密码?

帖子内容:
·HTML标签: 不可用
·UBB标签: 可用
·贴图标签: 可用
·Flash标签:不可用
·表情字符转换:不可用
·最多15KB

[按 Ctrl+Enter 直接发送]




电话:0769-22723100 传真:0769-22465296  版权所有:东莞自动化论坛  
页面执行次数:18116996次  执行时间:2,253.906 毫秒