Как обновить данные с устройства Modbus RTU в форму через C# - PullRequest
0 голосов
/ 11 марта 2020

Я хочу обновить показания значения из регистра устройства Modbus, затем отображать на Windows Формы каждые секунды. Вот тот код, который я сделал с помощью C#

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            RTU2();
        }
        catch (Exception ex)
        {

           MessageBox.Show(ex.StackTrace, "Error");
        }

    //    Console.ReadKey();
    }
    public  void RTU2()
    {

        using (SerialPort port = new SerialPort("COM7"))
        {

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
            {

                // configure serial port
                port.BaudRate = 19200;
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                port.Open();
                while (true)
                {
                    {
                        // create modbus master
                        ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

                        byte slaveId = 1;
                        int startua1 = int.Parse(txtUA1.Text.Trim(), System.Globalization.NumberStyles.HexNumber);
                        ushort startAddressua1 = (ushort)startua1;

                        // read large value in two 16 bit chunks and perform conversion
                        Thread.Sleep(100); // Delay 100ms
                        ushort[] registersua = master.ReadHoldingRegisters(slaveId, startAddressua1, 2);



                        float UAV = (float)(decimal)valueua / 100000;

                        //DISPLAY VALUE ON FORM
                        UA.Text = UAV.ToString("###,###.00");//'Cross-thread operation not valid: Control 'UA' accessed from a thread other than the thread it was created on.'


                        Thread.Sleep(2000); // Delay 20ms
                    }
                }

            }));

        }

Однако, это была ошибка, подобная этой. enter image description here

Пожалуйста, помогите мне, как мне правильно отредактировать этот код, Спасибо

1 Ответ

1 голос
/ 11 марта 2020

Кажется, UA - это элемент управления, и вы пытаетесь изменить UA.Text в потоке, не являющемся пользовательским интерфейсом, в ThreadPool.

Для достижения этого сохраните значение в m_szUAV и обновите m_szUAV до UA.Text в системе. Windows .Forms.Timer's Tick.

System.Windows.Forms.Timer timer;
public Form1()
{
    // Constructor's original code 
    InitializeComponent();

    // Initial your timer
    timer = new System.Windows.Forms.Timer();
    timer.Interval = 50;
    timer.Tick += Timer_Tick;
    timer.Enable = true;
}

string m_szUAV = string.Empty;

private void Timer_Tick( object sender, EventArgs e )
{
    UA.Text = m_szUAV;
}

public  void RTU2()
{

    using (SerialPort port = new SerialPort("COM7"))
    {

        ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
        {

            // configure serial port
            port.BaudRate = 19200;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();
            while (true)
            {
                {
                    // create modbus master
                    ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

                    byte slaveId = 1;
                    int startua1 = int.Parse(txtUA1.Text.Trim(), System.Globalization.NumberStyles.HexNumber);
                    ushort startAddressua1 = (ushort)startua1;

                    // read large value in two 16 bit chunks and perform conversion
                    Thread.Sleep(100); // Delay 100ms
                    ushort[] registersua = master.ReadHoldingRegisters(slaveId, startAddressua1, 2);

                    float UAV = (float)(decimal)valueua / 100000;

                    // Save value to private member
                    m_szUAV = UAV.ToString("###,###.00");

                    Thread.Sleep(2000); // Delay
                }
            }

        }));

    }
...