nmodbuspc.dll异常如图

vbdocnet 2018-05-01 12:29:01

用nmodbuspc.dll做Modbus Slave出现这样的异常使得程序直接退出了,貌似是超出了寄存器的最大值。请各位大神指教,看看能不能解决。
...全文
704 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-05-01
  • 打赏
  • 举报
回复
贴出可供测试的代码
vbdocnet 2018-05-01
  • 打赏
  • 举报
回复
比如某个从站PLC响应主站,数据帧为0F 03 02 02 46 51 17 ,然后用nmodbus做的rtu从站也收到了这个数据帧。结果,用nmodbus做的从站程序就跳出如图异常,然后程序就自动退出了。
vbdocnet 2018-05-01
  • 打赏
  • 举报
回复
代码是实现rtu从站的。主站上位机已经做好了。从站中还有PLC等仪表,调试的时候发现在以下代码中接收到别的PLC的数据帧时,程序就崩溃了。 代码如下:
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

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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