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