110,538
社区成员
发帖
与我相关
我的任务
分享
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Windows.Forms
Imports System.IO.Ports
Imports Modbus
Imports Modbus.Device
Imports Modbus.Data
Public Class 停机事件
Dim SlaveID As Byte '从站号
Dim SerialPort1 As New SerialPort
Dim Slave As ModbusSlave
Dim ListenFlag As Boolean = False
Dim TimeCount As UInt16 '停机时间计时
Dim StartTimer2Flag As Boolean = False
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
cmbBaud.SelectedIndex = 4
cmbDataBit.SelectedIndex = 1
cmbParity.SelectedIndex = 2
cmbStopBit.SelectedIndex = 0
cmbPort.SelectedIndex = 0
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Modbue_Request_Event(ByVal sender As Object, ByVal e As Modbus.Device.ModbusSlaveRequestEventArgs)
'request from master
Try
Dim fc As Byte = e.Message.FunctionCode
Dim data() As Byte = e.Message.MessageFrame
'判断地址是否正确
If data(0) <> SlaveID Then
Exit Sub
End If
Dim byteStartaddress() As Byte = {data(3), data(2)}
Dim byteNum() As Byte = {data(5), data(4)}
If (fc = 4) Then
'开启计时
StartTimer2Flag = True
End If
Dim startAddress As Short = BitConverter.ToInt16(byteStartaddress, 0)
Dim NumOfPoint As Short = BitConverter.ToInt16(byteNum, 0)
'Console.WriteLine(fc.ToString() + "," + startAddress.ToString() + "," + NumOfPoint.ToString())
Catch ex As Exception
End Try
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Try
Timer1.Stop()
If (StartTimer2Flag = True) Then
StartTimer2Flag = False
Timer2.Enabled = True
send.Enabled = True
End If
Slave.DataStore.HoldingRegisters(1) = EventA_1
Slave.DataStore.HoldingRegisters(2) = EventA_2
Slave.DataStore.HoldingRegisters(3) = EventA_3
Slave.DataStore.HoldingRegisters(4) = EventA_4
Slave.DataStore.HoldingRegisters(5) = EventA_5
Slave.DataStore.HoldingRegisters(6) = EventA_6
Slave.DataStore.HoldingRegisters(7) = EventA_7
Slave.DataStore.HoldingRegisters(8) = EventB_1
Slave.DataStore.HoldingRegisters(9) = EventB_2
Slave.DataStore.HoldingRegisters(10) = EventB_3
Slave.DataStore.HoldingRegisters(11) = EventB_4
Slave.DataStore.HoldingRegisters(12) = EventB_5
Slave.DataStore.HoldingRegisters(13) = EventC_1
Slave.DataStore.HoldingRegisters(14) = EventC_2
Slave.DataStore.HoldingRegisters(15) = EventC_3
Slave.DataStore.HoldingRegisters(16) = EventC_4
Slave.DataStore.HoldingRegisters(17) = EventC_5
Slave.DataStore.HoldingRegisters(18) = EventC_6
Slave.DataStore.HoldingRegisters(19) = EventD_1
Slave.DataStore.HoldingRegisters(20) = EventD_2
Slave.DataStore.HoldingRegisters(21) = EventD_3
Slave.DataStore.HoldingRegisters(22) = EventD_4
Timer1.Start()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
'发送按钮
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles send.Click
Try
'失能发送按钮
send.Enabled = False
If ComboBox1.SelectedItem = Nothing Then
MessageBox.Show("请选择停机事件,再点击确定!")
Return
End If
'停止停机计时
Timer2.Enabled = False
Select Case ComboBox1.SelectedIndex
Case 0
EventA_1 = TimeCount
Exit Select
Case 1
EventA_2 = TimeCount
Exit Select
Case 2
EventA_3 = TimeCount
Exit Select
Case 3
EventA_4 = TimeCount
Exit Select
Case 4
EventA_5 = TimeCount
Exit Select
Case 5
EventA_6 = TimeCount
Exit Select
Case 6
EventA_7 = TimeCount
Exit Select
Case 7
EventB_1 = TimeCount
Exit Select
Case 8
EventB_2 = TimeCount
Exit Select
Case 9
EventB_3 = TimeCount
Exit Select
Case 10
EventB_4 = TimeCount
Exit Select
Case 11
EventB_5 = TimeCount
Exit Select
Case 12
EventC_1 = TimeCount
Exit Select
Case 13
EventC_2 = TimeCount
Exit Select
Case 14
EventC_3 = TimeCount
Exit Select
Case 15
EventC_4 = TimeCount
Exit Select
Case 16
EventC_5 = TimeCount
Exit Select
Case 17
EventC_6 = TimeCount
Exit Select
Case 18
EventD_1 = TimeCount
Exit Select
Case 19
EventD_2 = TimeCount
Exit Select
Case 20
EventD_3 = TimeCount
Exit Select
Case 21
EventD_4 = TimeCount
Exit Select
End Select
MessageBox.Show("发送完毕!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
Try
Timer1.Enabled = False
Timer2.Enabled = False
Slave.Stop()
Slave.Dispose()
SerialPort1.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
'开始监听按钮
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles listen.Click
Try
Slave = ModbusSerialSlave.CreateRtu(SlaveID, SerialPort1)
AddHandler Slave.ModbusSlaveRequestReceived, AddressOf Modbue_Request_Event
Slave.DataStore = Modbus.Data.DataStoreFactory.CreateDefaultDataStore(0, 0, 65535, 1)
Slave.Listen()
'开启定时器1,定时将停机时间对应的时间写入保持寄存器
Timer1.Enabled = True
'失能设备地址设置
TextBox1.Enabled = False
'失能开始监听按钮
listen.Enabled = False
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
Try
Timer2.Stop()
TimeCount += 1
Timer2.Start()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub opencom_Click(sender As Object, e As EventArgs) Handles opencom.Click
Try
SerialPort1.PortName = cmbPort.Text
SerialPort1.BaudRate = Integer.Parse(cmbBaud.SelectedItem.ToString())
If cmbParity.SelectedIndex = 0 Then
SerialPort1.Parity = Parity.None
ElseIf cmbParity.SelectedIndex = 1 Then
SerialPort1.Parity = Parity.Odd
Else
SerialPort1.Parity = Parity.Even
End If
If cmbStopBit.SelectedIndex = 0 Then
SerialPort1.StopBits = StopBits.One
Else
SerialPort1.StopBits = StopBits.Two
End If
SerialPort1.Open()
SerialPort1.ReceivedBytesThreshold = 8
Dim i As Byte
i = CByte(TextBox1.Text)
SlaveID = i
listen.Enabled = True
opencom.Enabled = False
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
Try
If MessageBox.Show("关闭软件会影响数据采集系统,确认要关闭吗?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
e.Cancel = True
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class