Mitsubishi公司的FX2N系列PLC与计算机之间的串口通讯,参考代码如下
mports System.IO.Ports
Public Class Form1
'使用WithEvents关键字声明一个通信端口对象
Dim WithEvents RS232 As SerialPort
'初始化取得计算机中存在的可用串行通讯端口
Sub initializing()
For Each sp As String In SerialPort.GetPortNames()
cmbCOM.Items.Add(sp) 'cmbCOM是ComboBox控件,该代码用来取得系统找到的所有串口名称
Next
cmbCOM.Sorted = True '排序
cmbCOM.SelectedIndex = 0 '第一个是预设选项
End Sub
'联机,使用正确的通讯参数建立一个通讯端口对象
Sub online()
Try
RS232 = New IO.Ports.SerialPort(cmbCOM.SelectedItem.ToString, 9600, Parity.Even, 7, StopBits.Two)
'RS232.Encoding = System.Text.Encoding.ASCII,如果系统支持中文,可以使用Encoding.Unicode编码方案
If Not RS232.IsOpen Then RS232.Open()
Catch ex As Exception
MsgBox("通讯端口打开错误!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message, MsgBoxStyle.OkCancel)
End Try
End Sub
'离线,关闭通讯端口
Sub offline()
Try
If RS232.IsOpen Then RS232.Close() : RS232 = Nothing '释放资源
Catch ex As Exception
MsgBox("通讯端口关闭错误!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message, MsgBoxStyle.OkCancel)
End Try
End Sub
'通讯延时,通讯延时与串口处理数据时的ReadTimeout和WriteTimeout的含义是完全不同的
Sub TimeDelay(ByVal DT As Integer)
Dim ET As Integer
ET = Environment.TickCount()
Do
If Environment.TickCount() - ET >= DT Then Exit Do
Application.DoEvents() '处理队列中的讯息
Loop
End Sub
'串口数据接收函数
Function DataReceive() As String
Dim input As String, strfst As String
DataReceive = Nothing
input = RS232.ReadExisting()
If input <> Nothing Then
'以下代码用来判断接收的数据起始字符是STX(Chr(2))/ACK(Chr(6)),NAK/(Chr(21))
strfst = Asc(Microsoft.VisualBasic.Left(input, 1)).ToString
Select Case strfst
Case "2"
If rCheckSum(input) = "OKSUM" Then Return (input)
If rCheckSum(input) = "ERSUM" Then Return "ERSUM"
Case "6"
Return Asc(input).ToString
Case "21"
Return Asc(input).ToString
Case Else
Return "ERCOM" '如果所选串口返回的未知数据,说明串口通讯故障/计算机连接到未知设备!
End Select
Else
Return "ERCOM" '如果所选串口没有任何数据返回,说明串口通讯故障/PC Command ERROR!
End If
End Function
'**************************************************************
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
initializing()
btnoffline.Enabled = False
stx.Text = "Chr(2)"
cmd.Text = "0"
End Sub
Private Sub btnonline_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnonline.Click
online()
If RS232.IsOpen Then btnonline.Enabled = False
If RS232.IsOpen Then btnoffline.Enabled = True
End Sub
Private Sub btnoffline_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnoffline.Click
offline()
btnoffline.Enabled = False
btnonline.Enabled = True
End Sub
Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
If RS232 Is Nothing Then '判断是否已建立通信对象
End
Else
If RS232.IsOpen Then RS232.Close() '若已经打开,就将其关闭
End If
End
End Sub
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Try
If Not RS232 Is Nothing Then '判断是否已建立通信对象
Dim OutCmd As String
Dim indat As String
OutCmd = Nothing
indat = RS232.ReadExisting() '使用.ReadExisting()方法清空缓冲区
If cmd.Text.Trim = "0" Then OutCmd = cmd.Text.Trim + address.Text.Trim + byten.Text.Trim + Chr(3)
If cmd.Text.Trim = "1" Then OutCmd = cmd.Text.Trim + address.Text.Trim + byten.Text.Trim + data.Text.Trim + Chr(3)
OutCmd = Chr(2) + OutCmd + tCheckSum(OutCmd) '发送命令调用CheckSum函数生成CheckSum字符串
RS232.Write(OutCmd)
TimeDelay(300)
indat = DataReceive()
If indat = "ERCOM" Or indat = "ERSUM" Then
MsgBox("通讯故障!PLC OFFLINE!!!/数据传输错误!!!")
Else
txtResult.Text += OutCmd + "->" + indat + vbCrLf
txtResult.SelectionStart = txtResult.TextLength '将光标自动移至最下一位
txtResult.ScrollToCaret() '将光标自动移至最下一位
End If
Else
MsgBox("通信端口尚未打开!", MsgBoxStyle.OkCancel)
End If
Catch ex As Exception
MsgBox("通讯端口发生故障!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message)
End Try
End Sub
'应用程序窗口关闭时的响应事件,如果RS232通讯已建立就将其关闭再退出
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If RS232 Is Nothing Then '判断是否已建立通信对象
End
Else
If RS232.IsOpen Then RS232.Close() '若已经打开,就将其关闭
End If
End
End Sub
End Class