mscomm与plc通信,多窗口如何使用同一个串口?

dwnwsuaf 2017-05-17 04:28:40
如题,我现在把好所有窗口的程序都编好了,单独运行都可以对三菱PLC进行读写,置位复位。但是我现在想把各个窗口使用按钮连起来,生成exe程序。

比如使用普通的
unload me
form13.show

form13就会报错实时错误 8005
我后来又在unload 事件中加入如下指令

Private Sub Form_Unload(Cancel As Integer)

If MSComm1.PortOpen Then MSComm1.PortOpen = False

End Sub
然后在每个form 中都用:
MSComm1.CommPort = 3
MSComm1.InputMode = 0
MSComm1.RThreshold = 8
MSComm1.SThreshold = 0
MSComm1.Settings = "9600,e,7,1"
MSComm1.PortOpen = True


结果还是不行,
有哪位前辈有好方法吗?

ps:我自己想了几种方法,我也在试试
1.我能不能建一个MDI窗口,添加mscomm,然后所用窗口都设为子窗口,都调用这个窗口的mscomm?
2.在调用每个读取,写入子函数之前,都加上MSComm1.PortOpen = True
使用完后在MSComm1.PortOpen = false

附上我的一个读子函数:
e是按三菱plc通信协议写的字符串

Public Function showzhengxing(e As String) As Long
oo$ = e
'以上为命令合成计算
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True '打开通讯口
MSComm1.Output = oo$ '发送命令

Do
X% = DoEvents()
Loop Until MSComm1.InBufferCount >= 2 * 2 + 3
'等待回应
' Delar 0.5
Delay 0.1
Dim a$
Dim l, ascV As Integer
a = MSComm1.Input
Print a
l = Len(a)
' Text3.Text = a
If l > 0 Then
ascV = Asc(Mid(a, 1, 1))
Print ascV
If ascV = 2 Then
'MsgBox "读数据成功!"
End If

Dim Inbyte() As Byte
Dim datastr(80) As String
Dim w1, w2 As Integer
Dim b As Long


Dim dataV As Long

Inbyte = a
' Text1.Text = Inbyte
For I = 0 To UBound(Inbyte) Step 1
' Print Inbyte(i)
datastr(I) = Chr(Inbyte(I))
'Print datastr(i)
' Text2 = Text2 & datastr(i)
'注意显示的是10进制
Next

w1 = (Val("&H" & datastr(6))) * (16 ^ 3) + (Val("&H" & datastr(8))) * (16 ^ 2) + (Val("&H" & datastr(2))) * (16 ^ 1) + (Val("&H" & datastr(4))) * (16 ^ 0)

showzhengxing = w1
End If


'If MSComm1.PortOpen = True Then MSComm1.PortOpen = False '关闭通讯口
'End

End Function

...全文
382 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-05-20
  • 打赏
  • 举报
回复
引用 5 楼 bakw 的回复:
[quote=引用 4 楼 Chen8013 的回复:] 把控件放某窗口中,通过该窗口对象调用控件、或通过该窗口的公共接口(过程或函数)来操作,   比较适合“初级水平”的人使用。
用控件的话只能找个容器来放,有没有别的办法让控件不依赖窗体[/quote] 这没法,控件必须依赖窗体来放。 用模块的话,就要用纯API来做,还必须搞定“异步通讯模型”才行。 这个其实跟用纯API实现WinSocket异步通讯很相似,反正我目前是没有完善的代码。
笨狗先飞 2017-05-20
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
把控件放某窗口中,通过该窗口对象调用控件、或通过该窗口的公共接口(过程或函数)来操作,   比较适合“初级水平”的人使用。
用控件的话只能找个容器来放,有没有别的办法让控件不依赖窗体
笨狗先飞 2017-05-20
  • 打赏
  • 举报
回复
串口通讯感觉没必要异步的,100毫秒通不上直接就跳过了。 网上有一个叶帆写的仿mscomm的cls类,用api实现的异步,不过我也没试过。
舉杯邀明月 2017-05-19
  • 打赏
  • 举报
回复
把控件放某窗口中,通过该窗口对象调用控件、或通过该窗口的公共接口(过程或函数)来操作,   比较适合“初级水平”的人使用。
of123 2017-05-18
  • 打赏
  • 举报
回复
最简单的方式,在其中一个窗体上,例如 Form1 上,放一个 MSComm1。其他窗体访问 Form1.MSComm1 即可。

比较规范的是模块化的方式,易于移植。
1. 添加一个标准公用模块,在里面声明一个控件变量。公用模块中声明所有函数,其中的 MSComm 控件都使用上述变量:
Option Explicit

Public Comm As MSComm

Public Sub OpenComm()
Comm.CommPort = 3
Comm.InputMode = 0
Comm.RThreshold = 8
Comm.SThreshold = 0
Comm.Settings = "9600,e,7,1"
Comm.PortOpen = True
End Sub

Public Sub CloseComm()
Comm.PortOpen = False
End Sub

Public Function showzhengxing(e As String) As Long
Dim Inbyte() As Byte
Dim datastr(80) As String
Dim w1, w2 As Integer
Dim b As Long
Dim dataV As Long


oo$ = e
'ÒÔÉÏΪÃüÁîºÏ³É¼ÆËã
If Comm.PortOpen = False Then Comm.PortOpen = True '´ò¿ªÍ¨Ñ¶¿Ú
Comm.Output = oo$ '·¢ËÍÃüÁî

Do
X% = DoEvents()
Loop Until Comm.InBufferCount >= 2 * 2 + 3
'µÈ´ý»ØÓ¦
' Delar 0.5
Delay 0.1
Dim a$
Dim l, ascV As Integer
a = Comm.Input
Print a
l = Len(a)
' Text3.Text = a
If l > 0 Then
ascV = Asc(Mid(a, 1, 1))
Print ascV
If ascV = 2 Then
'MsgBox "¶ÁÊý¾Ý³É¹¦£¡"
End If


Inbyte = a
' Text1.Text = Inbyte
For I = 0 To UBound(Inbyte) Step 1
' Print Inbyte(i)
datastr(I) = Chr(Inbyte(I))
'Print datastr(i)
' Text2 = Text2 & datastr(i)
'×¢ÒâÏÔʾµÄÊÇ10½øÖÆ
Next

w1 = (Val("&H" & datastr(6))) * (16 ^ 3) + (Val("&H" & datastr(8))) * (16 ^ 2) + (Val("&H" & datastr(2))) * (16 ^ 1) + (Val("&H" & datastr(4))) * (16 ^ 0)

showzhengxing = w1
End If


'If COMM.PortOpen = True Then COMM.PortOpen = False '¹Ø±ÕͨѶ¿Ú
'End

End Function(唉,看见这狗啃的似的代码,心里就不爽。)

2. 在主窗体上放一个 MSComm1 控件。
Private Sub Form_Load()
Set Comm = MSComm1
End Sub

所有窗体中访问 MSComm,都用公用的控件变量或模块中的函数即可。
zdingyun 2017-05-18
  • 打赏
  • 举报
回复
赞楼上的正解。
笨狗先飞 2017-05-17
  • 打赏
  • 举报
回复
设置一个主窗口,控件就加在这个主窗口上,然后主窗口里配置好公共的读写函数,别的窗口通过调用主窗口的读写函数来和plc通讯,一但关掉主窗口,程序就结束。

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧