using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using xktComm.Common;
using xktComm.DataConvert;
using xktNodeSettings;
using xktNodeSettings.Node.Modbus;
using xktNodeSettings.Node.Variable;
namespace CMStestMdbus
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
modbusTCPList = ModbusTCPCFG.LoadXmlFile(settingPath);
SqlSugarService.SetConnectionStr("Data Source=" + Application.StartupPath + str2);
InitialInfo();
Communication();
}
string str2 = "\\config\\ZgTestData.db;Pooling=true;FailIfMissing=false";
//配置文件路径
private string settingPath = Application.StartupPath + "\\settings\\settingsss.xml";
InsertDataSQLite objInsert = new InsertDataSQLite(10000);//10秒1次
private string ipAddress = "127.0.0.1";
private int port = 502;
//private CancellationTokenSource cts = new CancellationTokenSource();
/// <summary>
/// 通讯函数
/// </summary>
private void Communication()
{
if (modbusTCPList.Count>0)//有modbusTCP节点
{
foreach (var dev in modbusTCPList) //遍历modbusTCP节点
{
if (dev.IsActive)
{
dev.cts = new CancellationTokenSource();
Task.Run(async () =>
{
while (!dev.cts.IsCancellationRequested)//默认是false
{
if (dev.IsConnected) //放解析
{
CommonMethods.TCPisConnected = dev.IsConnected;
foreach (var gp in dev.ModbusTCPGroupList)//遍历每一个组
{
if (gp.IsActive)
{
//读取数据
byte[] res = null;
//线圈存储区
if (gp.StoreArea == ModbusStoreArea.输入线圈 || gp.StoreArea == ModbusStoreArea.输出线圈)
{
//读取
switch (gp.StoreArea)
{
case ModbusStoreArea.输出线圈:
res = dev.modtcp.ReadOutputStatus(gp.Start, gp.Length);
break;
case ModbusStoreArea.输入线圈:
res = dev.modtcp.ReadInputStatus(gp.Start, gp.Length);
break;
default:
break;
}
//解析
//判断
if (res != null && res.Length == ((gp.Length % 8 == 0) ? gp.Length / 8 : gp.Length / 8 + 1))
{
dev.ErrorTimes = 0;
foreach (var variable in gp.varList)
{
//验证地址并解析地址
if (VerifyModbusAddress(true, variable.VarAddress, out int start, out int offset))
{
//真正的地址偏移
start -= gp.Start;
switch (variable.VarType)
{
case DataType.Bool:
variable.Value = BitLib.GetBitArrayFromByteArray(res, false)[start];
break;
default:
break;
}
//包含就替换,否则就添加
if (CommonMethods.CurrentPLCValue.ContainsKey(variable.Name))
{
CommonMethods.CurrentPLCValue[variable.Name] = variable.Value;
}
else
{
CommonMethods.CurrentPLCValue.Add(variable.Name, variable.Value);
}
}
}
}
else
{
dev.ErrorTimes++;
if (dev.ErrorTimes >= dev.MaxErrorTimes)
{
dev.IsConnected = false;
CommonMethods.TCPisConnected = dev.IsConnected;
}
}
}
//寄存器存储区
else
{
//读取
switch (gp.StoreArea)
{
case ModbusStoreArea.保持寄存器:
res = dev.modtcp.ReadKeepReg(gp.Start, gp.Length);
break;
case ModbusStoreArea.输入寄存器:
res = dev.modtcp.ReadInputReg(gp.Start, gp.Length);
break;
default:
break;
}
if (res != null && res.Length == gp.Length * 2)
{
dev.ErrorTimes = 0;
foreach (var variable in gp.varList)
{
if (VerifyModbusAddress(false, variable.VarAddress, out int start, out int offset))
{
start -= gp.Start;
start *= 2;
//2开始读取50个寄存器
//第一个变量地址是2,索引是0 (2-2)*2
//第二个变量地址是4,索引是4 (4-2)*2
//第三个变量地址是6,索引是8 (6-2)*2
switch (variable.VarType)
{
case DataType.Bool:
variable.Value = BitLib.GetBitFrom2ByteArray(res, start, offset, true)
使用Sqlsugar实现项目
于 2022-01-26 08:29:58 首次发布
本文详细介绍了如何在C#项目中利用Sqlsugar库进行数据库操作,涵盖了连接配置、实体映射、CRUD操作以及 LINQ 查询的使用方法,旨在提升开发效率并简化数据访问层的代码。
摘要由CSDN通过智能技术生成