Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Modbus数据记录到XML_C#_Xml_Logging_Modbus - Fatal编程技术网

C# 将Modbus数据记录到XML

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

目前,我在开发将modbus数据记录为XML格式而不是c#中的CSV的代码时遇到了一些困难。以下是我所做的代码:

    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。你确定你想要(需要)这个吗?