Имеется компьютер с modbus slave, нужно написать службу (сервис) modbus master, которая будет запущена на другом пк и будет писать данные в базу. Использую класс ModbusTCP. Проблема заключается в том что при добавление соединения к modbus перестает отрабатывать таймер timer1_Elapsed. В данный момент в файл service и в бд, пишется дата и время. + Должен записываться данные из регистра в файл. Пробовал использовать try и catch но записывается только (Сервис стартовал и Сервис остановлен). Программа эмуляции слейва modbus slave. Подскажите в чем проблема. Спасибо.
- [+] код C#
- using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Data.OracleClient;
using System.Text;
using System.Threading;
using ModbusTCP;
namespace WindowsService3
{
public partial class Service1 : ServiceBase
{
private ModbusTCP.Master MBmaster;
private byte[] data;
string res=" ";
private StreamWriter file;
private System.Timers.Timer timer1;
OracleConnection connnection = new OracleConnection("Соединение с бд");
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
file = new StreamWriter(new FileStream(@"c:\Service.txt", System.IO.FileMode.Append));
this.file.WriteLine("Сервис стартовал" +" "+ DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"));
this.file.Flush();
this.timer1 = new System.Timers.Timer();
this.timer1.Enabled = true;
this.timer1.Interval = 10000;
this.timer1.Elapsed +=new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
this.timer1.AutoReset = true;
this.timer1.Start();
}
private bool SaveDateTime(DateTime dt)
{
OracleCommand ocmn = new OracleCommand();
OracleDataAdapter oda = new OracleDataAdapter();
DataSet ds = new DataSet();
ocmn.CommandText = "test.mod1";
ocmn.CommandType = CommandType.StoredProcedure;
ocmn.Connection = connnection;
oda.SelectCommand = ocmn;
ocmn.Parameters.Add("dt", OracleType.DateTime);
ocmn.Parameters["dt"].Value = dt;
if (connnection.State != ConnectionState.Open)
connnection.Open();
try
{
ocmn.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
return false;
}
finally
{
connnection.Close();
}
}
private void ShowAs(object sender, System.EventArgs e)
{
double[] iword = new double[1];
string[] word = new string[1];
if (data.Length < 2) return;
iword = new double[data.Length / 2];
word = new string[data.Length / 2];
for (int x = 0; x < data.Length; x = x + 2)
{
iword[x / 2] = data[x] * 256 + data[x + 1];
word[x / 2] = iword[x / 2].ToString();
}
res = word[0].ToString();
}
private void MBmaster_OnResponseData(ushort ID, byte unit, byte function, byte[] values)
{
data = values;
ShowAs(null, null);
}
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
MBmaster = new Master("127.0.0.1", 502);
MBmaster.OnResponseData += new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData);
MBmaster.ReadHoldingRegister(3, 1, 0, 1);
bool check = SaveDateTime(DateTime.Now);
if (check == true)
{
this.file.WriteLine(res,DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + " OK!!! ");
}
else
{
this.file.WriteLine(res,DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + " NET!!! ");
}
this.file.Flush();
}
protected override void OnStop()
{
this.timer1.Stop();
this.file.WriteLine("Сервис остановлен" + " " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"));
this.file.Flush();
this.file.Close();
}
}
}