using HslCommunication;
using HslCommunication.Core.Address;
using HslCommunication.Profinet.Siemens;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Core.Utilities;
namespace WIDESEA_WCS.WCSClient
{
public class PLCClient
{
///
/// 西门子S7网络协议客户端
///
public SiemensS7Net SiemensS7NetClient { get; set; }
///
/// PLC连接对应的地址
///
public List PLCDBItems { get; set; }
///
/// 连接PLC设备名称
///
public string PLCName { get; set; }
///
/// 连接PLC网络IP地址
///
public string PLCIPAddress { get; set; }
///
/// 连接PLC描述说明
///
public string PLCDescription { get; set; }
///
/// 连接PLC端口号(默认102)
///
public int Port { get; set; } = 102;
///
///
///
public byte Rack { get; set; } = 0;
///
///
///
public byte Slot { get; set; } = 0;
///
/// 连接PLC是否成功
///
public bool IsConnected { get; set; } = false;
///
/// 连接信息
///
public string ConnectionMessage { get; set; }
///
/// PLC信息设备类型
///
public string plcinfo_equiptype { get; set; }
///
/// 检测PLC的心跳包
///
public bool heartFlag { get; set; } = true;
///
/// 构造方法,实例化连接对象及PLC连接对应的地址
///
/// 西门子PLC系列
public PLCClient(SiemensPLCS SiemensPLCS = SiemensPLCS.S1500)//此处固定使用了S1500,预计更改为根据数据库配置灵活使用
{
this.SiemensS7NetClient = new SiemensS7Net(SiemensPLCS);
PLCDBItems = new List();
}
///
/// PLC连接内置线程
///
Thread Thread { get; set; }
///
/// 内置线程是否运行
///
bool isRun { get; set; }
#region 内置线程 PING IP
///
/// 内置线程 PING IP
///
public void Start(Action action)
{
Thread = new Thread(() =>
{
while (isRun)
{
Thread.Sleep(1000);
OperateResult connectRead = SiemensS7NetClient.ReadInt32("DB500.436");
if (connectRead.IsSuccess)
{
if(!IsConnected)
{
Console.WriteLine($"【{SiemensS7NetClient.IpAddress}】PLC重连成功!");
}
IsConnected = true;
if(heartFlag)
{
if (WCSService.webServer.IsStarted)
{
Dictionary heartData = new Dictionary();
heartData.Add("IpAddress", SiemensS7NetClient.IpAddress);
heartData.Add("status", "on");
heartData.Add("currentDate", DateTimeHelper.GetFormatDateString());
string heartStr = JsonConvert.SerializeObject(heartData);
WCSService.webServer.PublishAllClientPayload(heartStr);
}
}
else
{
if (WCSService.webServer.IsStarted)
{
Dictionary heartData = new Dictionary();
heartData.Add("IpAddress", SiemensS7NetClient.IpAddress);
heartData.Add("status", "off");
heartData.Add("currentDate", DateTimeHelper.GetFormatDateString());
string heartStr = JsonConvert.SerializeObject(heartData);
WCSService.webServer.PublishAllClientPayload(heartStr);
}
}
heartFlag = !heartFlag;
}
else
{
IsConnected = false;
// Console.WriteLine($"【{SiemensS7NetClient.IpAddress}】PLC断开连接,并且在此重连");
Connect();
if (WCSService.webServer.IsStarted)
{
Dictionary heartData = new Dictionary();
heartData.Add("IpAddress", SiemensS7NetClient.IpAddress);
heartData.Add("status", "off");
heartData.Add("currentDate", DateTimeHelper.GetFormatDateString());
string heartStr = JsonConvert.SerializeObject(heartData);
WCSService.webServer.PublishAllClientPayload(heartStr);
}
}
}
});
Thread.Start();
}
#endregion
#region 连接PLC,将短连接切换成长连接模式
///
/// 连接PLC
///
public string Connect()
{
this.SiemensS7NetClient.IpAddress = PLCIPAddress;
this.SiemensS7NetClient.Port = Port;
this.SiemensS7NetClient.Rack = Rack;
this.SiemensS7NetClient.Slot = Slot;
this.SiemensS7NetClient.ConnectTimeOut = 2;
this.SiemensS7NetClient?.ConnectClose();
OperateResult result = this.SiemensS7NetClient.ConnectServer();
isRun = true;
if (!result.IsSuccess)
{
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}连接失败{Environment.NewLine}错误信息:{result.Message}", PLCName);
IsConnected = false;
return $"连接失败,错误信息:{result.Message}";
}
else
{
IsConnected = true;
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{PLCName}连接成功!", PLCName);
return $"连接成功";
}
}
#endregion
#region 断开与PLC的连接,将短连接切换成长连接模式
///
/// 断开与PLC的连接
///
public void Disconnect()
{
this.SiemensS7NetClient?.ConnectClose();
isRun = false;
this.SiemensS7NetClient?.Dispose();
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:已断开与{PLCName}的连接!", PLCName);
}
#endregion
#region 根据名称/描述读取PLC数据
///
/// 根据名称/描述读取PLC数据
///
/// 名称/描述(数据库中plcdetail_name列)
///
public virtual object ReadValue(string itemName)
{
lock (this.SiemensS7NetClient)
{
object result = null;
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName).FirstOrDefault();
if (item == null)
return -1;
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
result = Read(itemAddress, itemDatatype);
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 根据PLCDBItem读取PLC数据
///
/// 根据PLCDBItem读取PLC数据
///
///
///
public virtual object ReadValue(DBItemGroup item)
{
lock (this.SiemensS7NetClient)
{
object result = null;
if (item == null)
return -1;
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
result = Read(itemAddress, itemDatatype);
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 根据设备编号读取PLC数据
///
/// 根据设备编号读取PLC数据
///
/// 设备编号
/// json字符串
public object ReadValues(string equipNum)
{
lock (this.SiemensS7NetClient)
{
object result = null;
Dictionary keyValuePairs = new Dictionary();
List items = this.PLCDBItems.Where(x => x.EquipNum == equipNum).ToList();
for (int i = 0; i < items.Count(); i++)
{
keyValuePairs.Add(items[i].ItemName, ReadValue(items[i].ItemName));
}
result = JsonConvert.SerializeObject(keyValuePairs);
return result;
}
}
#endregion
#region 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串
///
/// 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串
///
/// 名称/描述(数据库中plcdetail_name列)
/// json字符串
public string ReadValuesByItemName(string itemName)
{
lock (this.SiemensS7NetClient)
{
string result = null;
Dictionary keyValuePairs = new Dictionary();
List items = this.PLCDBItems.Where(x => x.ItemName == itemName).ToList();
for (int i = 0; i < items.Count(); i++)
{
keyValuePairs.Add(items[i].EquipNum, ReadValue(items[i]));
}
result = JsonConvert.SerializeObject(keyValuePairs);
return result;
}
}
#endregion
#region 根据名称/描述和设备编号读取PLC数据
///
/// 根据名称/描述和设备编号读取PLC数据
///
/// 名称/描述(数据库中plcdetail_name列)
/// 设备编号
///
public virtual object ReadValue(string itemName, string equipNum)
{
lock (this.SiemensS7NetClient)
{
object result = null;
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault();
if (item == null)
{
try
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}{Environment.NewLine}({equipNum}):未在协议找到编号{equipNum}的地址", PLCName);
}
catch
{
}
throw new Exception($"未在协议找到编号{equipNum}的地址");
}
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
result = Read(itemAddress, itemDatatype);
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 将数据写入到PLC中
///
/// 将数据写入到PLC中
///
/// 名称/描述(数据库中plcdetail_name列)
/// 写入的值
///
public virtual bool WriteValue(string itemName, object value)
{
lock (this.SiemensS7NetClient)
{
OperateResult operateResult = new OperateResult(); ;
bool result = false;
string writeResult = "";
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName).FirstOrDefault();
if (item == null)
return false;
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
operateResult = Write(itemAddress, itemDatatype, value);
result = operateResult.IsSuccess;
writeResult = result ? "成功" : $"失败:{operateResult.Message}";
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:时间:{DateTime.Now},{PLCName}写入数据{writeResult}{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + value, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 将数据写入到PLC中
///
/// 将数据写入到PLC中
///
/// 名称/描述(数据库中plcdetail_name列)
/// 写入的值
///
public virtual bool WriteValue(string itemName, string equipNum, object value)
{
lock (this.SiemensS7NetClient)
{
OperateResult operateResult = new OperateResult(); ;
bool result = false;
string writeResult = "";
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault();
if (item == null)
return false;
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
for (int i = 0; i < 3; i++)
{
operateResult = Write(itemAddress, itemDatatype, value);
Thread.Sleep(33);
//flag = ReadValue(item).ToString();
//if (!value.ToString().Equals(flag))
//{
// WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:要写入的数据与读取的数据不符,读取数据:{flag},写入数据:{value}", PLCName);
// return false;
//}
result = operateResult.IsSuccess;
if (result)
break;
}
//writeResult = operateResult.IsSuccess ? "成功" : $"失败:{operateResult.Message}";
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:时间:{DateTime.Now},{PLCName}写入数据{writeResult}{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + value, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 批量写入数据
///
/// 批量写入数据(数据类型必须一致)
///
/// DB块起始地址
/// 数据类型
/// 写入的值
///
public OperateResult WriteArray(string adress, string type, object[] value)
{
OperateResult result = new OperateResult();
try
{
switch (type.ToLower())
{
case "int":
ushort[] tmp = new ushort[value.Length];
for (int i = 0; i < value.Length; i++)
{
tmp[i] = Convert.ToUInt16(value[i]);
}
result = this.SiemensS7NetClient.Write(adress, tmp);
break;
case "dint":
//result = this.SiemensS7NetClient.Write(adress, value as byte[]);
break;
case "char":
string temp = value.ToString();
byte[] writeData = Encoding.Default.GetBytes(temp);
result = this.SiemensS7NetClient.Write(adress, writeData);
break;
case "bool":
//result = this.SiemensS7NetClient.Write(adress, value);
break;
}
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}写入数据失败{Environment.NewLine}数据类型:{type}{Environment.NewLine}{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
return result;
}
///
/// 按操作符类型写数组
///
/// 操作类型
/// 写入的数组
///
public bool WriteArrayByOperatorType(string itemOperatorType, object[] value)
{
bool result = false;
try
{
OperateResult operateResult = new OperateResult(); ;
string writeResult = "";
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemOperatorType == itemOperatorType).OrderBy(x => x.EquipNum).OrderBy(r => r.ItemAddress).FirstOrDefault();
if (item == null)
return false;
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
operateResult = WriteArray(itemAddress, itemDatatype, value);
result = operateResult.IsSuccess;
writeResult = result ? "成功" : $"失败:{operateResult.Message}";
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:时间:{DateTime.Now},{PLCName}写入数据失败{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
return result;
}
#endregion
#region 批量读取数据
///
/// 批量读取数据(数据类型必须一致)
///
/// DB块起始地址
/// 数据类型
/// 读取长度
///
public object ReadArray(string adress, string type, int length)
{
object result = -1; ;
try
{
switch (type.ToLower())
{
case "int":
result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content;
break;
case "dint":
result = this.SiemensS7NetClient.ReadUInt32(adress, Convert.ToUInt16(length)).Content;
break;
case "char":
byte[] temps = this.SiemensS7NetClient.Read(adress, Convert.ToUInt16(length)).Content;
result = Encoding.Default.GetString(temps).ToCharArray();
break;
case "bool":
result = this.SiemensS7NetClient.ReadBool(adress, Convert.ToUInt16(length)).Content;
break;
case "byte":
break;
}
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
return result;
}
#endregion
#region 批量读取数据(改)著:曾南阳
///
/// 批量读取数据(根据数据库配置批量读取)
///
/// 名称描述
/// 设备编号
/// 读取长度
///
public object ReadArrays(string itemName, string equipNum, int length)
{
lock (this.SiemensS7NetClient)
{
object result = null;
DBItemGroup item = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault();
if (item == null)
{
try
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}{Environment.NewLine}({equipNum}):未在协议找到编号{equipNum}的地址", PLCName);
}
catch
{
}
throw new Exception($"未在协议找到编号{equipNum}的地址");
}
string itemAddress = item.ItemAddress;
string itemDatatype = item.ItemDataType;
try
{
result = Read(itemAddress, itemDatatype, length);
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{item.ItemDataType},{item.Remark}({itemAddress}):{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
try
{
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:{item.ItemDataType}{Environment.NewLine}{item.Remark}({itemAddress}):" + result, PLCName);
}
catch
{
}
return result;
}
}
#endregion
#region 根据名称/描述读取指定长度的bool数组
///
/// 根据名称/描述读取指定长度的bool数组
///
/// 起始地址名称/描述(数据库中plcdetail_name列)
/// 读取的长度信息
/// 设备编号
///
public OperateResult ReadBool(string itemName, ushort length, string equipNum)
{
string address = this.PLCDBItems.Where(x => x.ItemName == itemName && x.EquipNum == equipNum).FirstOrDefault().ItemAddress;
OperateResult operateResult = S7AddressData.ParseFrom(address);
bool flag = !operateResult.IsSuccess;
OperateResult result;
if (flag)
{
result = OperateResult.CreateFailedResult(operateResult);
}
else
{
ushort length2 = (ushort)((operateResult.Content.AddressStart + (int)length - 1) / 8 - operateResult.Content.AddressStart / 8 + 1);
int num = operateResult.Content.AddressStart % 8;
operateResult.Content.AddressStart = operateResult.Content.AddressStart - num;
operateResult.Content.Length = length2;
OperateResult operateResult2 = this.SiemensS7NetClient.Read(new S7AddressData[]
{
operateResult.Content
});
bool flag2 = !operateResult2.IsSuccess;
if (flag2)
{
result = OperateResult.CreateFailedResult(operateResult2);
}
else
{
result = OperateResult.CreateFailedResult(operateResult2);
//result = OperateResult.CreateSuccessResult(operateResult2.Content.ToBoolArray().SelectMiddle(num, (int)length));
//WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Info:{Environment.NewLine}{PLCName}读取数据{Environment.NewLine}数据类型:bool{Environment.NewLine}状态({address},长度:{length}):" + JsonConvert.SerializeObject(result.Content), PLCName);
}
}
return result;
}
#endregion
#region 根据DB地址及类型读取数据,最根本读取方法
///
/// 根据DB地址及类型读取数据
///
/// DB地址(DB块+.+偏移量)
/// 数据类型(int/dint/string/bool)
///
public object Read(string adress, string type)
{
object result = -1; ;
try
{
switch (type.ToLower())
{
case "int":
result = this.SiemensS7NetClient.ReadInt16(adress).Content;
break;
case "dint":
result = this.SiemensS7NetClient.ReadUInt32(adress).Content;
break;
case "string":
OperateResult operateResult = this.SiemensS7NetClient.ReadString(adress);
operateResult.Content = operateResult.Content?.Replace("\\", "")?.Replace("\0", "")?.Replace("\u0014", "");
result = operateResult == null ? null : operateResult;
break;
case "bool":
result = this.SiemensS7NetClient.ReadBool(adress).Content;
break;
case "byte":
result = this.SiemensS7NetClient.ReadByte(adress).Content;
break;
case "word":
result = this.SiemensS7NetClient.ReadUInt16(adress).Content;
break;
default:
throw new Exception($"未找到该数据类型:{type}");
//break;
}
}
catch (Exception ex)
{
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
string str = "";
foreach (var item in stackFrames)
{
str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine;
}
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message},{str}", PLCName);
}
return result;
}
#endregion
#region 根据DB地址及类型批量读取数据,最根本读取方法
///
/// 根据DB地址及类型批量读取数据
///
/// DB地址(DB块+.+偏移量)
/// 数据类型(int/dint/string/bool)
///
public object Read(string adress, string type, int length)
{
object result = -1; ;
try
{
switch (type.ToLower())
{
case "int":
result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content;
break;
case "dint":
result = this.SiemensS7NetClient.ReadUInt32(adress, Convert.ToUInt16(length)).Content;
break;
case "char":
byte[] temps = this.SiemensS7NetClient.Read(adress, Convert.ToUInt16(length)).Content;
result = Encoding.Default.GetString(temps).ToCharArray();
break;
case "bool":
result = this.SiemensS7NetClient.ReadBool(adress, Convert.ToUInt16(length)).Content;
break;
case "word":
result = this.SiemensS7NetClient.ReadUInt16(adress, Convert.ToUInt16(length)).Content;
break;
default:
throw new Exception($"未找到该数据类型:{type}");
}
}
catch (Exception ex)
{
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
string str = "";
foreach (var item in stackFrames)
{
str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine;
}
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{Environment.NewLine}{PLCName}读取数据失败{Environment.NewLine}数据类型:{type},{adress}:{Environment.NewLine}错误信息:{ex.Message},{str}", PLCName);
}
return result;
}
#endregion
#region 根据DB地址及类型写入数据,最根本写入方法
///
/// 根据DB地址及类型写入数据
///
/// DB地址(DB块+.+偏移量)
/// 数据类型(int/dint/string/bool)
/// 写入的值
/// 返回成功或失败
public OperateResult Write(string adress, string type, object value)
{
OperateResult result = new OperateResult();
try
{
switch (type.ToLower())
{
case "int":
result = this.SiemensS7NetClient.Write(adress, Convert.ToInt16(value));
break;
case "dint":
result = this.SiemensS7NetClient.Write(adress, Convert.ToUInt32(value));
break;
case "string":
//string[] adressTmp = adress.Split('.');
result = this.SiemensS7NetClient.Write(adress, value.ToString());
break;
case "bool":
result = this.SiemensS7NetClient.Write(adress, Convert.ToBoolean(value));
break;
case "byte":
{
byte[] by = { Convert.ToByte(value) };
result = this.SiemensS7NetClient.Write(adress, by);
}
break;
default:
throw new Exception($"未找到该数据类型:{type}");
}
}
catch (Exception ex)
{
WIDESEA_Common.Tools.WriteLog.GetLog(PLCName).Write($"Error:{PLCName}写入数据失败{Environment.NewLine}数据类型:{type}{Environment.NewLine}{adress}:{Environment.NewLine}错误信息:{ex.Message}", PLCName);
}
return result;
}
#endregion
}
}