C# 将Modbus数据记录到XML
目前,我在开发将modbus数据记录为XML格式而不是c#中的CSV的代码时遇到了一些困难。以下是我所做的代码:C# 将Modbus数据记录到XML,c#,xml,logging,modbus,C#,Xml,Logging,Modbus,目前,我在开发将modbus数据记录为XML格式而不是c#中的CSV的代码时遇到了一些困难。以下是我所做的代码: public partial class FormMain : Form { public FormMain() { InitializeComponent(); InitializeRegisters(); } private void FormMain_Load(object sender, EventAr
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
InitializeRegisters();
}
private void FormMain_Load(object sender, EventArgs e)
{
try
{
//Start Modbus RTU Service
ModbusRTUProtocol.Start();
timer1.Enabled = true;
//HMI Display (Label) Controls
displayControl1.Register = ModbusRTUProtocol.Registers[0];
displayControl2.Register = ModbusRTUProtocol.Registers[1];
displayControl3.Register = ModbusRTUProtocol.Registers[2];
//HMI Editor Controls
editorControl1.Register = ModbusRTUProtocol.Registers[3];
editorControl2.Register = ModbusRTUProtocol.Registers[4];
editorControl3.Register = ModbusRTUProtocol.Registers[5];
editorControl4.Register = ModbusRTUProtocol.Registers[6];
editorControl5.Register = ModbusRTUProtocol.Registers[7];
editorControl6.Register = ModbusRTUProtocol.Registers[8];
editorControl7.Register = ModbusRTUProtocol.Registers[9];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
ModbusRTUProtocol.Stop();
Application.DoEvents();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void InitializeRegisters()
{
ModbusRTUProtocol.Registers.Clear();
ModbusRTUProtocol.Registers.Add(new Register() { Address = 0 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 1 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 2 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 3 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 4 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 5 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 6 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 7 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 8 });
ModbusRTUProtocol.Registers.Add(new Register() { Address = 9 });
}
private void bttnSetEC_Click(object sender, EventArgs e)
{
if (bttnSetEC.Text == "Set EC")
{
bttnSetEC.Text = "Lock Setting";
editorControl1.Enabled = true;
editorControl2.Enabled = true;
editorControl3.Enabled = true;
}
else if (bttnSetEC.Text == "Lock Setting")
{
bttnSetEC.Text = "Set EC";
editorControl1.Enabled = false;
editorControl2.Enabled = false;
editorControl3.Enabled = false;
}
}
private void bttnSetpH_Click(object sender, EventArgs e)
{
if (bttnSetpH.Text == "Set pH")
{
bttnSetpH.Text = "Lock Setting";
editorControl4.Enabled = true;
editorControl5.Enabled = true;
editorControl6.Enabled = true;
}
else if (bttnSetpH.Text == "Lock Setting")
{
bttnSetpH.Text = "Set pH";
editorControl4.Enabled = false;
editorControl5.Enabled = false;
editorControl6.Enabled = false;
}
}
private void bttnPumpAutoOn_Click(object sender, EventArgs e)
{
if (bttnPumpAutoOn.Text == "Set Pump Automation")
{
bttnPumpAutoOn.Text = "Lock Pump Setting";
editorControl7.Enabled = true;
}
else if (bttnPumpAutoOn.Text == "Lock Pump Setting")
{
bttnPumpAutoOn.Text = "Set Pump Automation";
editorControl7.Enabled = false;
}
}
private void WriteLogInformation(string filename, string info1, string info2)
{
StringBuilder sbuilder = new StringBuilder();
using (StringWriter sw = new StringWriter(sbuilder))
{
using (XmlTextWriter w = new XmlTextWriter(sw))
{
w.WriteStartElement("LogInfo");
w.WriteElementString("Time", DateTime.Now.ToString());
w.WriteElementString("Info1", info1);
w.WriteElementString("Info2", info2);
w.WriteEndElement();
}
}
using (StreamWriter w = new StreamWriter(filename, true, Encoding.UTF8))
{
w.WriteLine(sbuilder.ToString());
}
}
private void timer1_Tick(object sender, EventArgs e)
{
string filename = @"c:\modbustest.xmllog";
//private static FileStream fs = new FileStream(@"c:\temp\mcb.txt", FileMode.OpenOrCreate, FileAccess.Write);
try
{
XmlSerializer x = new XmlSerializer(ModbusRTUProtocol.Registers[0]);
//WriteLogInformation(filename, string.Format(ModbusRTUProtocol.Registers[0]), string.Format("pH {0}", ModbusRTUProtocol.Registers[1]));
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Error");
}
}
这是我粘在上面的部分:
private void timer1_Tick(object sender, EventArgs e)
{
string filename = @"c:\modbustest.xmllog";
//private static FileStream fs = new FileStream(@"c:\temp\mcb.txt", FileMode.OpenOrCreate, FileAccess.Write);
try
{
XmlSerializer x = new XmlSerializer(ModbusRTUProtocol.Registers[0]);
//WriteLogInformation(filename, string.Format(ModbusRTUProtocol.Registers[0]), string.Format("pH {0}", ModbusRTUProtocol.Registers[1]));
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Error");
}
}
我试图读取线圈并将读取的数据输出到xml日志文件中。然而,这正是我坚持的地方,无法将数据输出到XML中
有人能帮我吗?试试下面的方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication189
{
class Program
{
const string FILENAME = @"C:\temp\test.xml";
static void Main(string[] args)
{
string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Modbus></Modbus>";
XDocument doc = XDocument.Parse(xml);
XElement modbus = doc.Root;
modbus.Add(new XElement("Register0", ModbusRTUProtocol.Registers[0]));
doc.Save(FILENAME);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序189
{
班级计划
{
常量字符串文件名=@“C:\temp\test.xml”;
静态void Main(字符串[]参数)
{
字符串xml=”“;
XDocument doc=XDocument.Parse(xml);
XElement modbus=文档根目录;
modbus.Add(新的XElement(“寄存器0”,ModBusRTU协议寄存器[0]);
文件保存(文件名);
}
}
}
Xml序列化对类对象起作用。您可以使用像Xml Linq这样的网络库直接从寄存器转到Xml。Xml需要一个结束标记,因此日志记录效率非常低。而且,流式传输很难得到正确的XML。你确定你想要(需要)这个吗?