В чем может быть ошибка? Запись по Modbus производится только в 1 регистр

Рейтинг: 0Ответов: 0Опубликовано: 03.08.2025

Если в общих чертах пишу небольшое приложение для передачи значений переменных, а именно 4 штук, с панели Siemens TP700 по протоколу Modbus TCP в ELAU C400. С использованием файла *.txt Делали давно на 1 переменную, лет так 5 назад, программка работает для 1 переменной. Начали добавлять переменные возникли проблемы. При чтении переменные читаются все. При записи, записывается только 1 и то только последний. Хотелось бы что бы кто-то посмотрел, почему, и что исправить? Заранее благодарен Код:

     using System;
     using System.Collections.Generic;
     using System.ComponentModel;
     using System.Data;
     using System.Drawing;
     using System.Text;
     using System.Windows.Forms;
     using Modbus.Device;      //for modbus master
     using System.Net;         //for tcp client
     using System.Net.Sockets;
     using System.Threading;
     using System.Runtime.InteropServices;
     using System.IO;
     namespace Fima
     {
     public partial class Form1 : Form
     {
     TcpClient tcpClient;
     ModbusIpMaster master;
     string ipAddress = "10.10.10.50";
     int tcpPort = 502;
     private int _currentValDl = -1;
     private int _currentValDr = -1;
     private int _currentValKk = -1;
     private int _currentValVm = -1;
     public Form1()
     {
        InitializeComponent();
        this.Hide();
    }
    private bool Connect()
    {
        if (master != null)
            master.Dispose();
        if (tcpClient != null)
            tcpClient.Close();
        try
        {
            tcpClient = new TcpClient();
            tcpClient.Connect(ipAddress, tcpPort);
            master = ModbusIpMaster.CreateIp(tcpClient);
            master.Transport.Retries = 0;
            master.Transport.ReadTimeout = 1500;
            this.Text = "On line " + DateTime.Now.ToString();
            label2.Text = DateTime.Now.ToString() + ":ELAU IS CONNECT.";
            return true;
        }
        catch (Exception ex)
        {
            label2.Text = DateTime.Now.ToString() + ":Connect process " + ex.StackTrace + "==>" + ex.Message;
            return false;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {
            byte slaveID = 0;
            ushort startAddressDl = 100;
            ushort startAddressDr = 102;
            ushort startAddressKk = 112;
            ushort startAddressVm = 113;
            ushort numOfPoints = 1;
            ushort[] holding_registerDl = master.ReadHoldingRegisters(slaveID, startAddressDl, numOfPoints);
            ushort[] holding_registerDr = master.ReadHoldingRegisters(slaveID, startAddressDr, numOfPoints);
            ushort[] holding_registerKk = master.ReadHoldingRegisters(slaveID, startAddressKk, numOfPoints);
            ushort[] holding_registerVm = master.ReadHoldingRegisters(slaveID, startAddressVm, numOfPoints);
            string valDl = "";
            string valDr = "";
            string valKk = "";
            string valVm = "";

            //read from elau dlina sreza
            for (int index = 0; index < holding_registerDl.Length; index++)
            {
                _currentValDl = Convert.ToInt32(holding_registerDl[index]);
                valDl = Convert.ToDouble(Convert.ToDouble(holding_registerDl[index]) / 10.0).ToString("0.00");
            }
            inputValueDl.Text = valDl;
            //read from elau diametr rollika
            for (int index = 0; index < holding_registerDr.Length; index++)
            {
                _currentValDr = Convert.ToInt32(holding_registerDr[index]);
                valDr = Convert.ToDouble(Convert.ToDouble(holding_registerDr[index]) / 100.0).ToString("0.00");
            }
            inputValueDr.Text = valDr;
            //read from elau koef. korrection
            for (int index = 0; index < holding_registerKk.Length; index++)
            {
                _currentValKk = Convert.ToInt32(holding_registerKk[index]);
                valKk = Convert.ToDouble(Convert.ToDouble(holding_registerKk[index]) / 1.0).ToString("0.00");
            }
            inputValueKk.Text = valKk;
            //read from elau vne metki
            for (int index = 0; index < holding_registerVm.Length; index++)
            {
                _currentValVm = Convert.ToInt32(holding_registerVm[index]);
                valVm = Convert.ToDouble(Convert.ToDouble(holding_registerVm[index]) / 10.0).ToString("0.00");
            }
            inputValueVm.Text = valVm;
            //write to file
            if (!File.Exists(@"\elau_to_panelDl.txt")) File.Create(@"\elau_to_panelDl.txt").Close();
            using (StreamWriter swFile = new StreamWriter(new FileStream(@"\elau_to_panelDl.txt", FileMode.OpenOrCreate), Encoding.ASCII))
            {
                swFile.Write(Convert.ToString(_currentValDl));

                swFile.Close();
            }
            if (!File.Exists(@"\elau_to_panelDr.txt")) File.Create(@"\elau_to_panelDr.txt").Close();
            using (StreamWriter swFile = new StreamWriter(new FileStream(@"\elau_to_panelDr.txt", FileMode.OpenOrCreate), Encoding.ASCII))
            {
                swFile.Write(Convert.ToString(_currentValDr));
                swFile.Close();
            }
            if (!File.Exists(@"\elau_to_panelKk.txt")) File.Create(@"\elau_to_panelKk.txt").Close();
            using (StreamWriter swFile = new StreamWriter(new FileStream(@"\elau_to_panelKk.txt", FileMode.OpenOrCreate), Encoding.ASCII))
            {
                swFile.Write(Convert.ToString(_currentValKk));
                swFile.Close();
            }
            if (!File.Exists(@"\elau_to_panelVm.txt")) File.Create(@"\elau_to_panelVm.txt").Close();
            using (StreamWriter swFile = new StreamWriter(new FileStream(@"\elau_to_panelVm.txt", FileMode.OpenOrCreate), Encoding.ASCII))
            {
                swFile.Write(Convert.ToString(_currentValVm));
                swFile.Close();
            }
            label2.Text = "ELAU CONNECT - READ DATA OK -" + _currentValDl.ToString();
            label7.Text = "ELAU CONNECT - READ DATA OK -" + _currentValDr.ToString();
            label8.Text = "ELAU CONNECT - READ DATA OK -" + _currentValKk.ToString();
            label10.Text = "ELAU CONNECT - READ DATA OK -" + _currentValVm.ToString();
        }
        catch (Exception ex)
        {
            label2.Text = "ELAU NOT AVALIBLE - READ DATA NOT OK";
            label7.Text = "ELAU NOT AVALIBLE - READ DATA NOT OK";
            label8.Text = "ELAU NOT AVALIBLE - READ DATA NOT OK";
            label10.Text = "ELAU NOT AVALIBLE - READ DATA NOT OK";
            Connect();
            label2.Text = ex.ToString();
            label7.Text = ex.ToString();
            label8.Text = ex.ToString();
            label10.Text = ex.ToString();
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Connect();
        timer1.Enabled = true;
        timer2.Enabled = true;

        this.Hide();
    }

    private void inputValueDl_GotFocus(object sender, EventArgs e)
    {

    }
    private void inputValueDr_GotFocus(object sender, EventArgs e)
    {

    }
    private void inputValueKk_GotFocus(object sender, EventArgs e)
    {

    }
    private void inputValueVm_GotFocus(object sender, EventArgs e)
    {

    }

    private void timer2_Tick(object sender, EventArgs e)
    {
        try
        {
            if (_currentValDl == -1) return;
            

            {
                if (!File.Exists(@"\panel_to_elauDl.txt"))
                {
                    File.Create(@"\panel_to_elauDl.txt").Close();
                    return;
                }
                

                string readTextDl = "-1";
                using (StreamReader readtext = new StreamReader(new FileStream(@"\elau_to_panelDl.txt", FileMode.Open), Encoding.ASCII))
                {
                    readTextDl = readtext.ReadLine();
                }
                if (readTextDl.Length > 1)
                {
                    if (Convert.ToInt32(readTextDl) != _currentValDl)
                    {
                        ushort output_valueDl = (ushort)(Convert.ToInt32(readTextDl));
                        master.WriteSingleRegister(0, 100, output_valueDl);
                    }
                }
                label2.Text = "ELAU CONNECT - WRITE DATA OK - " + readTextDl;
            }

            if (_currentValDr == -1) return;

            {
                if (!File.Exists(@"\panel_to_elauDr.txt"))
                {
                    File.Create(@"\panel_to_elauDr.txt").Close();
                    return;
                }
                string readTextDr = "-1";
                using (StreamReader readtext = new StreamReader(new FileStream(@"\elau_to_panelDr.txt", FileMode.Open), Encoding.ASCII))
                {
                    readTextDr = readtext.ReadLine();
                }
                if (readTextDr.Length > 1)
                {
                    if (Convert.ToInt32(readTextDr) != _currentValDr)
                    {
                        ushort output_valueDr = (ushort)(Convert.ToInt32(readTextDr));
                        master.WriteSingleRegister(0, 102, output_valueDr);
                    }
                }
                label7.Text = "ELAU CONNECT - WRITE DATA OK - " + readTextDr;
            }

            if (_currentValKk == -1) return;

            {
                if (!File.Exists(@"\panel_to_elauKk.txt"))
                {
                    File.Create(@"\panel_to_elauKk.txt").Close();
                    return;
                }
                string readTextKk = "-1";
                using (StreamReader readtext = new StreamReader(new FileStream(@"\elau_to_panelKk.txt", FileMode.Open), Encoding.ASCII))
                {
                    readTextKk = readtext.ReadLine();
                }
                if (readTextKk.Length > 1)
                {
                    if (Convert.ToInt32(readTextKk) != _currentValKk)
                    {
                        ushort output_valueKk = (ushort)(Convert.ToInt32(readTextKk));
                        master.WriteSingleRegister(0, 112, output_valueKk);
                    }
                }
                label8.Text = "ELAU CONNECT - WRITE DATA OK - " + readTextKk;
            }

            if (_currentValVm == -1) return;

            {
                if (!File.Exists(@"\panel_to_elauVm.txt"))
                {
                    File.Create(@"\panel_to_elauVm.txt").Close();
                    return;
                }
                string readTextVm = "-1";
                using (StreamReader readtext = new StreamReader(new FileStream(@"\elau_to_panelVm.txt", FileMode.Open), Encoding.ASCII))
                {
                    readTextVm = readtext.ReadLine();
                }
                if (readTextVm.Length > 1)
                {
                    if (Convert.ToInt32(readTextVm) != _currentValVm)
                    {
                        ushort output_valueVm = (ushort)(Convert.ToInt32(readTextVm));
                        master.WriteSingleRegister(0, 113, output_valueVm);
                    }
                }
                label10.Text = "ELAU CONNECT - WRITE DATA OK - " + readTextVm;
            }                                               
        }
        catch (Exception ex)
        {
            Connect();
            label2.Text = "Ошибка записи в ELAU " + ex.ToString();
            label7.Text = "Ошибка записи в ELAU " + ex.ToString();
            label8.Text = "Ошибка записи в ELAU " + ex.ToString();
            label10.Text = "Ошибка записи в ELAU " + ex.ToString();
           }
          }
         }
        }

Последний который записывается

string readTextVm = "-1";
                using (StreamReader readtext = new StreamReader(new FileStream(@"\elau_to_panelVm.txt", FileMode.Open), Encoding.ASCII))
                {
                    readTextVm = readtext.ReadLine();
                }
                if (readTextVm.Length > 1)
                {
                    if (Convert.ToInt32(readTextVm) != _currentValVm)
                    {
                        ushort output_valueVm = (ushort)(Convert.ToInt32(readTextVm));
                        master.WriteSingleRegister(0, 113, output_valueVm);
                    }
                }

В эти созданные файлы, с помощью Tiaportal и script в файл записывается необходимое значение, и это же значение при помощи:

master.WriteSingleRegister(0, 113, output_valueVm);

В определенный регистр записывается значение, но в моем случае, почему то запись производится только в данный регистр в 113 При работе программки с 1 переменной там был регистр 100

Ответы

Ответов пока нет.