返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >详解.NET6下的Modbus通讯和数据库记录
  • 433
分享到

详解.NET6下的Modbus通讯和数据库记录

2024-04-02 19:04:59 433人浏览 八月长安
摘要

所用的包: <Project Sdk="Microsoft.net.Sdk">   <PropertyGroup>     <OutputType&g

所用的包:

<Project Sdk="Microsoft.net.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWindowsFORMs>true</UseWindowsForms>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <None Include="..\.editorconfig" Link=".editorconfig" />
  </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.3" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="6.0.3" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.3" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.sqlite" Version="6.0.3" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.3">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
        <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
        <PackageReference Include="Microsoft.Extensions.Configuration.JSON" Version="6.0.0" />
        <PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
        <PackageReference Include="Newtonsoft.json" Version="13.0.1" />
        <PackageReference Include="NModbus4.netcore" Version="2.0.1" />
        <PackageReference Include="Pomelo.EntityFrameworkCore.Mysql" Version="6.0.1" />
    </ItemGroup>

    <ItemGroup>
      <None Update="Variablenode.json">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </None>
    </ItemGroup>


</Project>

通信库:

using Modbus.Device;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using thinger.DataConvertLib;

namespace EF6Demon
{
    public class NModBusHelper
    {
        private tcpClient tcpClient = null;
        private ModbusIpMaster master;

        public bool Connect(string ip, string port)
        {
            try
            {
                tcpClient = new TcpClient();
                tcpClient.Connect(IPAddress.Parse(ip), int.Parse(port));
                master = ModbusIpMaster.CreateIp(tcpClient);
            }
            catch (Exception)
            {
                return false;
            }
            
            return tcpClient.Connected;
        }

        public bool Disconnect()
        {
            if (tcpClient != null)
            {
                tcpClient.Close();
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public byte[] ReadKeepRegByteArr(string iAddress, string iLength)//偏移量,寄存器数量
        {
            try
            {
                ushort[] des = master.ReadHoldingReGISters(ushort.Parse(iAddress), ushort.Parse(iLength));
                byte[] res = ByteArrayLib.GetByteArrayFromUShortArray(des);
                return res;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public ushort[] ReadKeepRegUshort(string iAddress, string iLength)//偏移量,寄存器数量
        {
            try
            {
                ushort[] des = master.ReadHoldingRegisters(ushort.Parse(iAddress), ushort.Parse(iLength));
                //byte[] res = ByteArrayLib.GetByteArrayFromUShortArray(des);
                return des;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public List<float> AnalyseData_4x(ushort[] des, string iAddress)
        {
            int StartByte;
            StartByte = int.Parse(iAddress) * 2;
            List<float> floatArray = new List<float>();
            byte[] byteArray = ByteArrayLib.GetByteArrayFromUShortArray(des);

            for (int i = StartByte; i < byteArray.Length; i += 4)
            {
                floatArray.Add(FloatLib.GetFloatFromByteArray(byteArray, i));
            }
            return floatArray;
        }
    }
}

主程序:

using Microsoft.Extensions.Configuration;
using thinger.DataConvertLib;

namespace EF6Demon
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            this.Load += FrmMain_Load;
        }

        private ModelsResponsitory dbContext = new ModelsResponsitory();
        private ConfigurationBuilder cfgBuilder = new ConfigurationBuilder();
        private IConfigurationRoot configRoot;
        private CancellationTokenSource cts = new CancellationTokenSource();
        ushort[] res;
        string iAddress = "0";
        string iLenth; //寄存器个数
        private List<float> floatList = new List<float>();
        private CancellationTokenSource cts1 = new CancellationTokenSource();

        InsertDataSQLite objInsert = new InsertDataSQLite(10000);//10秒1次
        private NModBusHelper objTcp;


        private void FrmMain_Load(object? sender, EventArgs e)
        {
            //读取IP;
            cfgBuilder.AddJsonFile("Variablenode.json", optional: true, reloadOnChange: true);
            this.configRoot = cfgBuilder.Build();
            CommonMethods.Ip = configRoot.GetSection("NodeClass:ModbusNode:ServerURL").Value;
            CommonMethods.Port = configRoot.GetSection("NodeClass:ModbusNode:Port").Value;
            CommonMethods.VarNum = configRoot.GetSection("NodeClass:ModbusNode:VarNum").Value;
            //读取点表信息
            //for (int i = 0; i < int.Parse(CommonMethods.VarNum); i++)
            //{
            //    Variable variable = configRoot.GetSection($"NodeClass:ModbusNode:ModbusGroup:Variable:{i}").Get<Variable>();
            //    CommonMethods.AllVarList.Add(variable);
            //}
            this.iLenth = configRoot.GetSection("NodeClass:ModbusNode:ModbusGroup:Length").Value;
            CommonMethods.ModbusTCPList = dbContext.GetAllVariable();

            foreach (var item in CommonMethods.ModbusTCPList)
            {
                foreach (var item1 in item.ModbusNodes)
                {
                    foreach (var item2 in item1.ModbusGroups)
                    {
                        CommonMethods.AllVarList.AddRange(item2.Variables);
                    }
                }
            }

            InsertDataSQLite objInsert = new InsertDataSQLite(10000);//10秒1次
            ModbusTCPInitialInfo();
            Communication();
        }

        private void Communication()
        {
            if (CommonMethods.ModbusTCPList.Count() > 0)
            {
                foreach (var t in CommonMethods.ModbusTCPList)
                {
                    foreach (var dev in t.ModbusNodes)
                    {
                        if (bool.Parse(dev.IsActive))
                        {
                            Task.Run(async () =>
                            {
                                while (!cts1.IsCancellationRequested)
                                {
                                    if (CommonMethods.IsConnected)
                                    {
                                        await Task.Delay(500);
                                        foreach (var gp in dev.ModbusGroups)
                                        {
                                            if (bool.Parse(gp.IsActive))
                                            {
                                                //读取数据
                                                byte[] res = null;
                                                if (int.Parse(gp.StoreArea) == 40000)
                                                {
                                                    res = objTcp.ReadKeepRegByteArr(gp.Start, gp.Length);
                                                }

                                                if (res != null && res.Length == int.Parse(gp.Length) * 2)
                                                {
                                                    CommonMethods.ErrorTimes = 0;
                                                    foreach (var variable in gp.Variables)
                                                    {
                                                        if (VerifyModbusAddress(false, variable.VarAddress, out int start, out int offset))
                                                        {
                                                            start -= int.Parse(gp.Start);
                                                            start *= 2;
                                                            // ABCD = 0,BADC = 1, CDAB = 2, DCBA = 3,
                                                            switch (variable.VarType)
                                                            {
                                                                case "Float":
                                                                    variable.Value = FloatLib.GetFloatFromByteArray(res, start, DataFormat.ABCD).ToString();
                                                                    break;
                                                                case "UShort":
                                                                    variable.Value = UShortLib.GetUShortFromByteArray(res, start, DataFormat.ABCD).ToString();
                                                                    break;
                                                                default:
                                                                    break;
                                                            }

                                                            //包含就替换,否则就添加
                                                            if (CommonMethods.CurrentPLCValue.ContainsKey(variable.Name))
                                                            {
                                                                CommonMethods.CurrentPLCValue[variable.Name] = variable.Value;

                                                            }
                                                            else
                                                            {
                                                                CommonMethods.CurrentPLCValue.Add(variable.Name, variable.Value);
                                                            }
                                                        }
                                                    }
                                                }

                                                else
                                                {
                                                    CommonMethods.ErrorTimes++;
                                                    if (CommonMethods.ErrorTimes >= int.Parse(dev.MaxErrorTimes))
                                                    {
                                                        CommonMethods.IsConnected = false;
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    else
                                    {
                                        if (!CommonMethods.FirstConnect)
                                        {
                                            //延时
                                            await Task.Delay(int.Parse(dev.ReConnectTime));
                                            objTcp?.Disconnect();
                                        }
                                        //第一次 连接
                                        //初始化通信对象
                                        objTcp = new NModBusHelper();
                                        CommonMethods.IsConnected = objTcp.Connect(dev.ServerURL, dev.Port);
                                        CommonMethods.FirstConnect = false;
                                        await Task.Delay(200);
                                    }
                                }

                            }, cts1.Token);
                        }
                    }
                }
            }


        }

        private void ModbusTCPInitialInfo()
        {
            foreach (var variable in CommonMethods.AllVarList)
            {
                if (!CommonMethods.CurrentPLCVariable.ContainsKey(variable.Name))
                {
                    CommonMethods.CurrentPLCVariable.Add(variable.Name, variable);
                }
                else
                {
                    CommonMethods.CurrentPLCVariable[variable.Name] = variable;
                }

                //存储的归档变量
                if (bool.Parse(variable.ArcHiveEnable))
                {
                    CommonMethods.ArchiveVarList.Add(variable);
                }
            }

            //归档变量, 用来查询实时数据, ArchiveEnable的数据要与配置文件SystemSet一致
            foreach (var variable in CommonMethods.ArchiveVarList)
            {
                if (!CommonMethods.CurrentPLCNote.ContainsKey(variable.Name))
                {
                    CommonMethods.CurrentPLCNote.Add(variable.Name, variable.Description);
                }
                else
                {
                    CommonMethods.CurrentPLCNote[variable.Name] = variable.Description;
                }
            }

        }

        private bool VerifyModbusAddress(bool isBit, string address, out int start, out int offset)
        {
            if (isBit)
            {
                offset = 0;
                return int.TryParse(address, out start);
            }
            else
            {
                if (address.Contains('.'))
                {
                    string[] result = address.Split('.');
                    if (result.Length == 2)
                    {
                        bool val = true;
                        int res = 0;
                        val = val && int.TryParse(result[0], out res);
                        start = res;
                        val = val && int.TryParse(result[1], out res);
                        offset = res;
                        return val;
                    }
                    else
                    {
                        start = 0;
                        offset = 0;
                        return false;
                    }
                }
                else
                {
                    offset = 0;
                    return int.TryParse(address, out start);
                }
            }
        }
        //设置ListBox
        private void Addinfo(string info)
        {
            this.isInfo.Items.Insert(
                0, DateTime.Now.ToString("HH:mm:ss") + " " + info + Environment.NewLine);
        }

        private void btnConn_Click(object sender, EventArgs e)
        {

        }

        private NodeClass nodeClass = new NodeClass();
        private ModbusNode modbusNode = new ModbusNode();
        private ModbusGroup modbusGroup = new ModbusGroup();
        private void btnInsert_Click(object sender, EventArgs e)
        {
            //using (MyDbContext dbContext = new MyDbContext())
            //{
            //    this.nodeClass = configRoot.GetSection("NodeClass").Get<NodeClass>();
            //    this.modbusNode = configRoot.GetSection("NodeClass:ModbusNode").Get<ModbusNode>();
            //    this.modbusGroup = configRoot.GetSection("NodeClass:ModbusNode:ModbusGroup").Get<ModbusGroup>();
            //    dbContext.NodeClasses.AddAsync(this.nodeClass);
            //    dbContext.ModbusNodes.AddAsync(this.modbusNode);
            //    dbContext.ModbusGroups.AddAsync(this.modbusGroup);
            //    List<Variable> variables = new List<Variable>();
            //    for (int i = 0; i < int.Parse(CommonMethods.VarNum); i++)
            //    {
            //        Variable variable = configRoot.GetSection($"NodeClass:ModbusNode:ModbusGroup:Variable:{i}").Get<Variable>();
            //        variables.Add(variable);
            //    }
            //    dbContext.Variables.AddRangeAsync(variables);
            //    dbContext.SaveChangesAsync();
            //}
        }

        private void btnIn_Click(object sender, EventArgs e)
        {
            //List<ActualData> list = new List<ActualData>();
            ModelsResponsitory db = new ModelsResponsitory();

            this.Dgv.DataSource= db.GetActualData();
        }
    }
}

插入数据库

using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class InsertDataSQLite
    {
        System.Timers.Timer t;

        int count = 0;

        public InsertDataSQLite(int Interval)
        {
            t = new System.Timers.Timer(Interval);
            t.Elapsed += T_Elapsed;
            t.AutoReset = true;
            t.Enabled = true;
            t.Start();
            count = CommonMethods.CacheCount; //默认为600
        }

        private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (CommonMethods.IsConnected)
            {
                InsertActualData();
            }
        }

        private void InsertActualData()
        {
            if (CommonMethods.CurrentPLCValue != null && CommonMethods.CurrentPLCValue.Count > 0)
            {
                List<ActualData> actualDataArray = new List<ActualData>();
                //List<ReportData> reportDataArray = new List<ReportData>();
                DateTime dt = DateTime.Now;
                foreach (var item in CommonMethods.AllVarList) //FileVarModbusList归档集合
                {
                    string varName = item.Name;//modbus 点表中的名称
                    string description = item.Description; //注释
                    double value = 0;

                    if (!CommonMethods.CurrentPLCValue.ContainsKey(varName))
                    {
                        value = 0;
                    }
                    else
                    {
                        value = double.Parse(item.Value);
                        //value = Convert.ToDouble(CommonMethods.CurrentPLCValue[varName]);
                    }

                    if (actualDataArray.Count <= 1000)
                    {
                        actualDataArray.Add(new ActualData()
                        {
                            InsertTime = dt,
                            Name = varName,
                            Value = value.ToString("f2"),
                            Description = description
                        });
                    }
                    else
                    {
                        actualDataArray.RemoveAt(0);
                    }
                }

                var db = new ModelsResponsitory();
                db.AddActualData(actualDataArray);
            }
        }

    }
}

通用类

using Microsoft.EntityFrameworkCore.Query;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class CommonMethods
    {
        public static Dictionary<string, object> CurrentPLCValue = new Dictionary<string, object>();

        //归档变量集合
        public static List<Variable> ArchiveVarList = new List<Variable>();

        //所有
        public static List<Variable> AllVarList = new List<Variable>();
        /// <summary>
        /// 键值对,键是变量名称,值是其对应的变量实体对象 用来写数据
        /// </summary>
        public static Dictionary<string, Variable> CurrentPLCVariable = new Dictionary<string, Variable>();

        /// <summary>
        /// 变量名称和变量地址的键值对
        /// </summary>
        public static Dictionary<string, string> CurrentPLCNote = new Dictionary<string, string>();

        public static bool IsConnected = false;

        public static int CacheCount = 600;//10分钟, 每秒一条

        public static IIncludableQueryable<NodeClass, IEnumerable<Variable>> ModbusTCPList;
        public static int ErrorTimes = 0;
        public static bool FirstConnect = true;
        public static string Ip;
        public static string Port;
        public static string VarNum;
    }
}

EFcore的配置

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Sqlite;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;

namespace EF6Demon
{
    public class MyDbContext:DbContext
    {
        public DbSet<ActualData> ActualDatas { get; set; } //api中为复数, 而不是数据库表
        public DbSet<NodeClass> NodeClasses { get; set; }
        public DbSet<ModbusNode> ModbusNodes { get; set; }
        public DbSet<ModbusGroup> ModbusGroups { get; set; }
        public DbSet<Variable> Variables { get; set; }
        public DbSet<SysAdmin> SysAdmins { get; set; }

        private ConfigurationBuilder cfgBuilder = new ConfigurationBuilder();

        //private IConfiguration configuration;

        //private string connString;

        public MyDbContext()
        {
            //configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("Ipcfg.json").Build();
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            cfgBuilder.AddJsonFile("VariableNode.json", optional: true, reloadOnChange: true);
            IConfigurationRoot configRoot = cfgBuilder.Build();
            string connString = configRoot.GetSection("ConnectionStrings:SqliteConnectionString").Value;

            optionsBuilder.UseSqlite(connString);
            //configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("Ipcfg.json").Build();
            
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //ConfigurationBuilder cfg1 = new ConfigurationBuilder();
            //cfg1.AddJsonFile("VariableNode.json", optional: true, reloadOnChange: true);
            //IConfigurationRoot configRoot = cfg1.Build();
            //string varNum = configRoot.GetSection("NodeClass:ModbusNode:VarNum").Value;
            //IList<Variable> iniVariableList = new List<Variable>();
            //for (int i = 0; i < int.Parse(varNum); i++)
            //{
            //    Variable variable = configRoot.GetSection($"NodeClass:ModbusNode:ModbusGroup:Variable:{i}").Get<Variable>();
            //    iniVariableList.Add(variable);
            //}

            var iniActualData = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"/Database/Variable.json");
            IList<ActualData> iniActualList = JsonConvert.DeserializeObject<IList<ActualData>>(iniActualData);
            //modelBuilder.Entity<Variable>().HasData(iniVariableList);

            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }
}
    //VS终端下
    // 视图-其他窗口-程序包控制台
    //选择默认项目
    //add-migration initialMigration //创建数据迁移
    //add-migration initialMigration1 //创建数据迁移
    // update-database
    //Remove-migration 删除最后一次脚本
    //Script-Migration 显示迁移的sql脚本

    //DBfirst
    // Scaffold-DbContext "server=192.168.207.107; database=Demon1; uid=root; pwd=123456" Pomelo.EntityFrameworkCore.mysql

    //根据已有数据库创建数据模型。在 NuGet 的程序包管理(Package Manager)控制台中(Powershell)执行命令:
    //Scaffold-DbContext "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -OutputDir Data -Force
    //.net core CLi:dotnet ef dbcontext scaffold "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -o Data -f

    //CMD 命令下 安装EF工具:
    //dotnet tool install --global dotnet-ef
    //数据迁移:
    //dotnet ef migrations add DataSeeding
    //数据更新:
    //dotnet ef database update
    

模型:

using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class Variable
    {
        public long Id { get; set; }
        public string Number { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Type { get; set; }
        public string VarAddress { get; set; }
        public string Scale { get; set; }
        public string Offset { get; set; }
        public string Start { get; set; }
        public string AccessProperty { get; set; }
        public string AlarmEnable { get; set; }
        public string ArchiveEnable { get; set; }
        public string SetLimitEnable { get; set; }
        public string AlarmType { get; set; }
        public string DiscreteAlarmType { get; set; }
        public string DiscreteAlarmPriority { get; set; }
        public string DiscreteAlarmNote { get; set; }
        public string LoLoAlarmEnable { get; set; }
        public string LoLoAlarmValue { get; set; }
        public string LoLoAlarmPriority { get; set; }
        public string LoLoAlarmNote { get; set; }
        public string LowAlarmEnable { get; set; }
        public string LowAlarmValue { get; set; }
        public string LowAlarmPriority { get; set; }
        public string LowAlarmNote { get; set; }
        public string HighAlarmEnable { get; set; }
        public string HighAlarmValue { get; set; }
        public string HighAlarmPriority { get; set; }
        public string HighAlarmNote { get; set; }
        public string HiHiAlarmEnable { get; set; }
        public string HiHiAlarmValue { get; set; }
        public string HiHiAlarmPriority { get; set; }
        public string HiHiAlarmNote { get; set; }
        public string ArchivePeriod { get; set; }
        public string SetLimitMax { get; set; }
        public string SetLimitMin { get; set; }
        public string VarType { get; set; }
        public string StoreType { get; set; }
        public string InsertTime { get; set; }
        public string Value { get; set; }
        public long ModbusGroupId { get; set; }
        public ModbusGroup ModbusGroup { get; set; }
    }
}

using System.Collections.Generic;

namespace EF6Demon
{
    public class ModbusGroup
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Type { get; set; }
        public string StoreArea { get; set; }
        public string Length { get; set; }
        public string Start { get; set; }
        public string SlaveID { get; set; }
        public string IsActive { get; set; }
        public long ModbusNodeId { get; set; }
        public ModbusNode ModbusNode { get; set; }
        public List<Variable> Variables { get; set; } = new List<Variable>();
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ModbusNode
    {
        public ModbusNode()
        {

        }
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string ModbusType { get; set; }
        public string ConnectTimeOut { get; set; }
        public string CreateTime { get; set; }
        public string ReConnectTime { get; set; }
        public string IsActive { get; set; }
        public string MaxErrorTimes { get; set; }
        public string KeyWay { get; set; }
        public string UseAlarmCheck { get; set; }
        public string ServerURL { get; set; }
        public string Port { get; set; }
        public string DataFormat { get; set; }
        public string VarNum { get; set; }
        public long NodeClassId { get; set; }
        public List<ModbusGroup> ModbusGroups { get; set; } = new List<ModbusGroup>();
        public NodeClass NodeClass { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class NodeClass
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public List<ModbusNode> ModbusNodes { get; set; } = new List<ModbusNode>();

    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ActualData
    {
        public long Id { get; set; }
        public string Description { get; set; }
        public string Name { get; set; }
        public string Value { get; set; }
        public DateTime InsertTime { get; set; }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6Demon
{
    public class SysAdmin
    {
        public long Id { get; set; }
        public string LoginName { get; set; }
        public string Pwd { get; set; }
        public string HandCtrl { get; set; }
        public string AutoCtrl { get; set; }
        public string SysSet { get; set; }
        public string SysLog { get; set; }
        public string Report { get; set; }
        public string Trend { get; set; }
        public string UserManage { get; set; }

    }
}

模型配置:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    internal class NodeClassConfig : IEntityTypeConfiguration<NodeClass>
    {
        public void Configure(EntityTypeBuilder<NodeClass> builder)
        {
            builder.ToTable("NodeClass");
            builder.HasKey(a => a.Id);
            builder.Property(a => a.Description).HasMaxLength(100);
            builder.HasMany<ModbusNode>(n=>n.ModbusNodes).WithOne(m=> m.NodeClass);
        }
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ModbusNodeConfig : IEntityTypeConfiguration<ModbusNode>
    {
        public void Configure(EntityTypeBuilder<ModbusNode> builder)
        {
            builder.ToTable("ModbusNode");
            builder.HasKey(a => a.Id);
            builder.Property(a => a.Description).HasMaxLength(100);
            builder.HasOne<NodeClass>(m => m.NodeClass)
                    .WithMany(n => n.ModbusNodes)
                    .HasForeignKey(c => c.NodeClassId);
        }
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ModbusGroupConfig : IEntityTypeConfiguration<ModbusGroup>
    {
        public void Configure(EntityTypeBuilder<ModbusGroup> builder)
        {
            builder.ToTable("ModbusGroup");
            builder.HasKey(a => a.Id);
            builder.Property(a => a.Description).HasMaxLength(100);
            builder.HasOne<ModbusNode>(c => c.ModbusNode)
                    .WithMany(a => a.ModbusGroups)
                    .HasForeignKey(c => c.ModbusNodeId);
        }
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class VariableConfig : IEntityTypeConfiguration<Variable>
    {
        public void Configure(EntityTypeBuilder<Variable> builder)
        {
            builder.ToTable("Variable");
            builder.HasKey(v => v.Id);
            builder.Property(v => v.Description).HasMaxLength(100);
            builder.HasOne<ModbusGroup>(v => v.ModbusGroup).WithMany(m=>m.Variables).HasForeignKey(v=>v.ModbusGroupId);
        }
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ActualDataConfig : IEntityTypeConfiguration<ActualData>
    {
        public void Configure(EntityTypeBuilder<ActualData> builder)
        {
            builder.ToTable("ActualData");
            builder.HasKey(a => a.Id);
            builder.Property(a => a.Description).HasMaxLength(100);
        }
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public class ModbusGroupConfig : IEntityTypeConfiguration<ModbusGroup>
    {
        public void Configure(EntityTypeBuilder<ModbusGroup> builder)
        {
            builder.ToTable("ModbusGroup");
            builder.HasKey(a => a.Id);
            builder.Property(a => a.Description).HasMaxLength(100);
            builder.HasOne<ModbusNode>(c => c.ModbusNode)
                    .WithMany(a => a.ModbusGroups)
                    .HasForeignKey(c => c.ModbusNodeId);
        }
    }
}

通过外键, 建立各设备组之间的关系,生成服务类

using Microsoft.EntityFrameworkCore.Query;
using System;
using System.Collections.Generic;
using System.Text;

namespace EF6Demon
{
    public interface IProvider
    {
        List<ActualData> GetActualData();
        void AddActualData(List<ActualData> actualData);
        IIncludableQueryable<NodeClass, IEnumerable<Variable>> GetAllVariable();
    }
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EF6Demon
{
    public class ModelsResponsitory : IProvider
    {
        private MyDbContext db = new MyDbContext();

        public MyDbContext Db
        {
            get { return db; }
            set { db = value; }
        }

        public void AddActualData(List<ActualData> actualData)
        {
            db.ActualDatas.AddRangeAsync(actualData);
            db.SaveChangesAsync();
        }

        public List<ActualData> GetActualData()
        {

            //IQueryable<ActualData> actualData = db.ActualDatas.Where(a=>a.Id>10);
            //return actualData;
            IEnumerable<ActualData> actualData1 = db.ActualDatas;
            //IEnumerable<TSource> IOrderedEnumerable<TSource> OrderByDescending 全部取出,在内存中比较Where(a => a.Id > 10)
            actualData1.Where(a => a.Id > 10).OrderByDescending(i => i.Id).Take(20);


            //IQueryable<TSource> Where IOrderedQueryable<TSource> OrderByDescending, 给服务器发sql语句 Where(a => a.Id > 10)
            //加上toList 把数据全部取回本地, 不占用带宽
            IQueryable<ActualData> actualData =db.ActualDatas;
            return actualData.Where(a => a.Id > 10).OrderByDescending(i => i.Id).Take(20).ToList(); 
        }
        

        public IIncludableQueryable<NodeClass, IEnumerable<Variable>> GetAllVariable()
        {
              return db.NodeClasses.
              Include(n => n.ModbusNodes.Where(nodes => nodes.NodeClassId == 1))
              .ThenInclude(m => m.ModbusGroups.Where(groups => groups.ModbusNodeId == 1))
              .ThenInclude(gp => gp.Variables.Where(v => v.ModbusGroupId == 1));
        }
    }
}

本地配置文件:

{
  "ConnectionStrings": {
    "SqliteConnectionString": "Data Source=E:\\Csharp\\EF6Demon\\EF6Demon\\bin\\Debug\\net6.0-windows\\Database\\DbSqlite.db",
    "MySQLConnectionString": "server=192.168.85.102; database=OneToMany; uid=root; pwd=123456;"
  },
  "NodeClass": {
    "Id": 1,
    "Name": "ModbusClent",
    "Description": "Modbus相关客户端",
    "ModbusNode": {
      "Id": 1,
      "NodeClassId": 1,
      "Name": "ModbusTCPClient",
      "Description": "1#ZG上位机测试",
      "ModbusType": "2000",
      "ConnectTimeOut": "2000",
      "CreateTime": "0",
      "ReConnectTime": "5000",
      "IsActive": "True",
      "MaxErrorTimes": "1",
      "KeyWay": "VarName",
      "UseAlarmCheck": "True",
      "ServerURL": "127.0.0.1",
      "Port": "502",
      "DataFormat": "ABCD",
      "VarNum": "6",
      "ModbusGroup": {
        "Id": 1,
        "Name": "保持寄存器长度为寄存器个数",
        "Description": "40001-40010",
        "Type": "ModbusTCP",
        "StoreArea": "40000",
        "Length": "10",
        "Start": "0",
        "SlaveID": "1",
        "IsActive": "true",
        "ModbusNodeId": 1,
        "Variable": [
          {
            "Id": 1,
            "Number": "1",
            "Name": "Float1",
            "Description": "40001-40002",
            "Type": "ModbusTCP",
            "VarAddress": 0,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40001-40002低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40001-40002低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40001-40002高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40001-40002高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "Float",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          },
          {
            "Id": 2,
            "Number": "2",
            "Name": "Float2",
            "Description": "40003-40004",
            "Type": "ModbusTCP",
            "VarAddress": 2,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40003-40004低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40003-40004低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40003-40004高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40003-40004高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "Float",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          },
          {
            "Id": 3,
            "Number": "3",
            "Name": "Float3",
            "Description": "40005-40006",
            "Type": "ModbusTCP",
            "VarAddress": 4,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40005-40006低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40005-40006低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40005-40006高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40005-40006高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "Float",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          },
          {
            "Id": 4,
            "Number": "4",
            "Name": "Float4",
            "Description": "40007-40008",
            "Type": "ModbusTCP",
            "VarAddress": 6,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40003-40004低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40003-40004低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40003-40004高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40003-40004高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "Float",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          },
          {
            "Id": 5,
            "Number": "5",
            "Name": "Ushort1",
            "Description": "40009",
            "Type": "ModbusTCP",
            "VarAddress": 8,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40009低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40009低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40009高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40009高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "UShort",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          },
          {
            "Id": 6,
            "Number": "6",
            "Name": "Ushort2",
            "Description": "40010",
            "Type": "ModbusTCP",
            "VarAddress": 9,
            "Scale": "1",
            "Offset": "0",
            "Start": "0",
            "AccessProperty": "读写",
            "AlarmEnable": "True",
            "ArchiveEnable": "True",
            "SetLimitEnable": "True",
            "AlarmType": "True",
            "DiscreteAlarmType": "False",
            "DiscreteAlarmPriority": "0",
            "DiscreteAlarmNote": "null",
            "LoLoAlarmEnable": "True",
            "LoLoAlarmValue": "0",
            "LoLoAlarmPriority": "0",
            "LoLoAlarmNote": "40009低低报警",
            "LowAlarmEnable": "True",
            "LowAlarmValue": "20",
            "LowAlarmPriority": "0",
            "LowAlarmNote": "40009低报警",
            "HighAlarmEnable": "True",
            "HighAlarmValue": "80",
            "HighAlarmPriority": "0",
            "HighAlarmNote": "40009高报警",
            "HiHiAlarmEnable": "True",
            "HiHiAlarmValue": "100",
            "HiHiAlarmPriority": "0",
            "HiHiAlarmNote": "40009高高报警",
            "ArchivePeriod": "80",
            "SetLimitMax": "100",
            "SetLimitMin": "0",
            "VarType": "UShort",
            "StoreType": "03 Holding Register(4x)",
            "InsertTime": "0",
            "Value": "0",
            "ModbusGroupId": 1
          }
        ]
      }
    }
  }
}

到此这篇关于.NET6下的Modbus通讯 和数据库记录的文章就介绍到这了,更多相关.NET6下的Modbus通讯 和数据库记录内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解.NET6下的Modbus通讯和数据库记录

本文链接: https://lsjlt.com/news/145298.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解.NET6下的Modbus通讯和数据库记录
    所用的包: <Project Sdk="Microsoft.NET.Sdk">   <PropertyGroup>     <OutputType&g...
    99+
    2024-04-02
  • 记录一下无聊的数据库作业
    题目如下: 查询sC表中的全部数据。2. 查询计算机系学生的姓名和年龄3.查询成绩在70~80分的学生的学号、课程号和成绩4.查询计算机系年龄在18~20岁的男生姓名和年龄s.查询C001课程的最高分6.查询计算机系学生的最大年龄...
    99+
    2017-02-11
    记录一下无聊的数据库作业
  • 数据库连接学习--简单的通讯录
    为了做毕业设计,学习了Java,然后就要连接数据库,为了连接数据库就学习做了一个简单的小项目,通讯录(现在只有添加的功能),成功连接数据库首先看看我的WEB首页吧:比较简单,然后是填加联系人页面我的数据库连...
    99+
    2024-04-02
  • 阿里云数据库记录清空方法详解
    阿里云数据库是阿里集团提供的一项重要服务,广泛应用于各种业务场景中。然而,有时我们可能需要清空数据库记录,以便重新开始或者避免数据丢失。本文将详细介绍如何在阿里云数据库中清空记录。 一、清空数据库记录的步骤登录阿里云账号:首先,你需要登录阿...
    99+
    2023-11-10
    阿里 清空 详解
  • Redis中键和数据库通用指令详解
    目录一、Redis键(key)通用指令1、key基本操作2、时效性控制3、查询模式4、其它操作二、数据库通用指令1、基本操作2、相关操作一、Redis键(key)通用指令 可以参考菜鸟教程:Redis 键命令用于管理 r...
    99+
    2022-08-10
    Redis通用指令 Redis键数据库
  • MySQL 删除表中的数据记录详解
      目录 前言言 一、删除表中的数据记录? 1.删除特定数据记录 2.删除所有数据记录 总结 前言         删除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录。在MySQL中可以通过DELETE语句来删...
    99+
    2023-09-11
    mysql 数据库 sql
  • Oracle数据库中通用的函数实例详解
    目录一、 Scott用户下的表结构1、如果自己没有Scoot表就可以自己创建一个二、单行函数1、字符函数2、数值函数三、多行函数(聚合函数)1、统计记录数2、最小值查询 min()3...
    99+
    2024-04-02
  • 非常详细的Django连接mysql数据库步骤记录
    目录一.修改数据库连接二.安装数据库驱动三.创建表并同步到mysql数据库:总结一.修改数据库连接 打开项目,在settings.py文件中是否有以下内容: 以上内容是创建django项目的时候是自动创建的。这个是告诉...
    99+
    2024-04-02
  • 如何通过备份记录获取数据库的增长情况
    今天就跟大家聊聊有关如何通过备份记录获取数据库的增长情况,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。通常大家想知道数据库是否增长了,增长了多少。大...
    99+
    2024-04-02
  • Ubuntu 下 Mariadb 数据库的安装和目录迁移
    Ubuntu 下 Mariadb 数据库的安装和目录迁移 1、简介 本文主要是 Ubuntu 下 Mariadb 数据库的安装和目录迁移,同样适用于 Debian 系统:Ubuntu 20.0.4 Mariadb:10.3.22 注意:文中...
    99+
    2017-01-26
    Ubuntu Mariadb 数据库的安装和目录迁移
  • 详解:如何恢复MySQL数据库下误删的数据
    2017-03-27 09:25 阅读 178 评论 0作者:马哥Linux运维-Robin血的教训,事发经过就不详述了。直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好...
    99+
    2024-04-02
  • Windows下 MySql通过拷贝data目录迁移数据库的方法
    MySQL数据库的文件目录下图所示,          现举例说明通过COPY文件夹data下数据库文件,进行数据拷贝的步骤;源数据库运行在A服务器上,拷贝到B服务器,假定B服务器上MySQL数据库已经安装完成,为空数据库。       ...
    99+
    2023-10-24
    数据库 mysql
  • centos7.2下安装mysql5.7数据库的命令详解
    服务器上的mysql安装了一个8.0.12版本的,本地的是一个5.7版本的,今天删除了重新安装的5.7版本的,下面是所有的名命令 跟着走就会安装上了。 配置源 wget http://dev.mysql...
    99+
    2024-04-02
  • MySQL数据库的事务和索引详解
    目录一、事务:事务四大特性:并发事务带来哪些问题?(隔离所导致的一些问题)事务隔离级别有哪些?MySQL的默认隔离级别:二、索引:索引的作用:索引的分类:索引准则:索引的数据结构:总...
    99+
    2024-04-02
  • 如何解决mysql数据库忘记登录密码的问题
    这篇文章主要介绍了如何解决mysql数据库忘记登录密码的问题,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。现如今我们需要设置密码的地方有很多,总...
    99+
    2024-04-02
  • 保证缓存和数据库的数据一致性详解
    目录1、错误的解决方案1.1、 先更新数据库,再删除缓存1.2、 先更新数据库,再更新缓存1.3、 先删除缓存,再更新数据库1.4、 先更新缓存,再更新数据库2、正确的解决方案2.1...
    99+
    2023-05-15
    缓存和数据库数据一致性 保证缓存和数据库数据一致性 数据一致性
  • Linux下如何破解MariaDB数据库的root登录密码
    这篇文章主要介绍Linux下如何破解MariaDB数据库的root登录密码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!忘记 root 登录密码[root@localhost ~]# mysql&...
    99+
    2023-06-28
  • 记录在Windows上安装和使用Oracle数据库过程中的坑
    1.安装Oracle Oracle软件是免费的,可以去官网下载相应的安装包。但是如果用于商业用途需要购买License。官网上针对各种平台,32位和64位都有,如果在Windows一般会下载到两个文件。以...
    99+
    2024-04-02
  • 实现.Net7下数据库定时检查的方法详解
    目录PeriodicTimerBackgroundService结合使用总结在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求...
    99+
    2022-12-20
    .Net7数据库定时检查 .Net7数据库检查 .Net7数据库
  • Redis数据库的安装和配置教程详解
    目录1.Redis安装1.1.Linux环境安装Redis1.2.Windows环境安装Redis2.Redis客户端安装2.1.Redis自带的命令行客户端2.2.安装Redis图...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作