2013-11-02 4 views
1

Я написал программу для подключения PLC S7-200 в C#. Я использую dll Nmodbus.Modbus - запись данных несколько раз зависает программа

Моя цель: Считывание данных через ПЛК и запись данных в ПЛК. Я использую таймер для чтения данных в сети от ПЛК.

Проблема: Когда я пишу данные более одного раза, моя программа зависает.

button1_Click: данные записи

Button5_click: обновление Показать данные

public partial class Form1 : Form 
    { 
     System.Timers.Timer aTimer = new System.Timers.Timer(5000); 
     SerialPort sp = new SerialPort("COM10"); 
     int count = 1; 
     void Update() 
     {  
      byte slaveId = 1; 
      ushort startAddress = 40001; 
      ushort numRegisters = 80; 

      // read five registers 
      IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(sp); 
      ushort[] registers = master.ReadHoldingRegisters(1, 0, 80); 

      for (int i = 0; i < numRegisters; i++) 
      { 
       string temp = "Register[" + (startAddress + i) + "]=" + registers[i]; 
       if (i == 36) 
        label10.Text = registers[i].ToString(); 
       listBox1.Items.Add(temp); 
      } 
     } 
     private void OnTimedEvent(object source, ElapsedEventArgs e) 
     { 

      button5_Click(source, e); 
      label11.Text = sp.IsOpen.ToString(); 
      // Update(); 
     } 

     public Form1() 
     { 

      InitializeComponent();   
      //if (sp.IsOpen) 
      //{ 
      // sp.Close(); 
      //} 
      //Update(); 
      sp.BaudRate = int.Parse(txtbaudrate.Text); 
      sp.DataBits = 8; 
      sp.Parity = Parity.None; 
      sp.StopBits = StopBits.One; 
      sp.Open(); 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      aTimer.Interval = 1000; 
      aTimer.Enabled = true; 


     } 
     ushort i = 1; 
     int j = 1; 
     bool flag = false; 
     private void button1_Click(object sender, EventArgs e) 
     { 
      if (sp.IsOpen) 
      { 
       try 
       { 
        flag = true; 
        aTimer.Stop(); 
        j++; 
        label11.Text = sp.IsOpen.ToString(); 
        sp.Close(); 
        sp.Open(); 
        sp.BaudRate = int.Parse(txtbaudrate.Text); 
        sp.DataBits = 8; 
        sp.Parity = Parity.None; 
        sp.StopBits = StopBits.One; 
        ushort startAddress = 40036; 
        ushort numRegisters = 80; 
        byte slaveId = 1; 
        ushort[] registers; 
        if (j % 2 != 0) 
        { 
         registers = new ushort[] { 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 }; 
        } 
        else 
        { 
         registers = new ushort[] { 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500 }; 
        } 


        // read five registers 
        IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(sp); 
        //ushort[] registers = master.ReadHoldingRegisters(1, 0, 5); 
        master.WriteMultipleRegisters(1, 36, registers); 

        //for (int i = 0; i < numRegisters; i++) 
        //{ 
        // string temp = "Register[" + (startAddress + i) + "]=" + registers[i]; 
        // listBox1.Items.Add(temp); 
        //} 
        sp.Close(); 
        sp.Open(); 
        aTimer.Start(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
        sp.Close(); 
       } 
      } 
     } 
     private void button5_Click(object sender, EventArgs e) 
     { 
      listBox1.Items.Clear(); 
      Update(); 
     } 
+0

@ Люди, которые голосуют, чтобы закрыть этот вопрос. Первоначальный вопрос мог быть написан на «плохом» английском языке, но было не так уж плохо, что никто не мог расшифровать то, что имел в виду OP. Если вы решите провести заочное голосование, объясните, что следует улучшить в комментариях, а не полагаться на близкую причину. – Sumurai8

ответ

2

Вы постоянно открывать и закрывать последовательный порт и создание новых Modbus Master объектов каждый раз, когда вы пытаетесь общаться с удаленным устройством. Кроме того, маловероятно, что вам понадобится/хотите изменить параметры последовательного порта (скорость передачи и т. Д.) Каждый раз, когда вы хотите поговорить с устройством.

(Закрытие и открытие порта может привести к потере данных, и, хотя я не могу вспомнить точные детали использования NModBus API, поскольку я не использовал их в течение нескольких лет, общий шаблон использования для этот тип комм будет включать в себя создание одного объекта-объекта для обмена информацией для всего сеанса, а не для создания нескольких сеансов во время сеанса - эти несколько экземпляров могут каким-то образом сталкиваться)

Итак, первое, что я думаю, вам следует сделать разбивает комм на три разных этапа: Запуск (создайте свои объекты связи (последовательный порт и мастер) при создании формы), Interact (разговаривайте с устройством и столько же, сколько необходимо для событий таймера) и Shutdown (закройте главный и последовательный порты при закрытии форма).

+0

Спасибо тебе, Джейсон Уилламс. –

Смежные вопросы