В чем может быть ошибка? Запись по Modbus производится только в 1 регистр
Если в общих чертах пишу небольшое приложение для передачи значений переменных, а именно 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