using CompressorXN_Common;
using CompressorXN_Model.ViewModel.Plc;
using HslCommunication;
using HslCommunication.Profinet.Omron;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CompressorXN_Communication.MyPlc
{
///
/// 欧姆龙PLC帮助类
///
public class OmronHelper
{
private static OmronCipNet omronCipNet = null;
///
/// 获取欧姆龙PLC连接对象
///
///
///
///
///
public static OmronCipNet GetOmronCipNet(string plcIp, int plcPort, int connectTimeOut = 3000)
{
omronCipNet = new OmronCipNet(plcIp, plcPort)
{
ConnectTimeOut = connectTimeOut
};
var connect = omronCipNet.ConnectServer();
isConnected = connect.IsSuccess;
if (connect.IsSuccess)
{
GlobalVar.omronCipNet = omronCipNet;
return omronCipNet;
}
else
{
return null;
}
}
///
/// 链接状态
///
private static bool isConnected = false;
public static bool IsConnected
{
get { return isConnected; }
}
///
/// 获取PLC值--单点位
///
/// 数据类型
/// 点位地址
/// 读取长度
///
public static (bool ok, string val) GetPlcVal(string dataType, string pointAddress, int length = 1, Encoding encoding = null)
{
var strVal = string.Empty;
try
{
if (!isConnected || omronCipNet == null)
{
return (false, strVal);
}
switch (dataType)
{
case "bool":
var operateBoolResult = omronCipNet.ReadBool(pointAddress);
if (!operateBoolResult.IsSuccess)
{
return (false, strVal);
}
else
{
var boolVal = operateBoolResult.Content;
strVal = boolVal.ToString();
return (true, strVal);
}
case "int":
var operateIntResult = omronCipNet.ReadInt32(pointAddress);
if (!operateIntResult.IsSuccess)
{
return (false, strVal);
}
else
{
var intVal = operateIntResult.Content;
strVal = intVal.ToString();
return (true, strVal);
}
case "short":
var operateShortResult = omronCipNet.ReadInt16(pointAddress);
if (!operateShortResult.IsSuccess)
{
return (false, strVal);
}
else
{
var shortVal = operateShortResult.Content;
strVal = shortVal.ToString();
return (true, strVal);
}
case "ushort":
var operateUshortResult = omronCipNet.ReadUInt16(pointAddress);
if (!operateUshortResult.IsSuccess)
{
return (false, strVal);
}
else
{
var ushortVal = operateUshortResult.Content;
strVal = ushortVal.ToString();
return (true, strVal);
}
case "float":
var operateFloatResult = omronCipNet.ReadFloat(pointAddress);
if (!operateFloatResult.IsSuccess)
{
return (false, strVal);
}
else
{
var floatVal = operateFloatResult.Content;
strVal = floatVal.ToString("f3");
return (true, strVal);
}
case "string":
var operateStringResult = omronCipNet.ReadString(pointAddress, (ushort)length, encoding == null ? Encoding.UTF8 : encoding);
if (!operateStringResult.IsSuccess)
{
return (false, strVal);
}
else
{
strVal = operateStringResult.Content;
return (true, strVal);
}
case "byte":
var operateByteResult = omronCipNet.Read(pointAddress, (ushort)length);
if (!operateByteResult.IsSuccess)
{
return (false, strVal);
}
else
{
if (encoding == null)
{
strVal = Encoding.ASCII.GetString(operateByteResult.Content);
}
else
{
strVal = encoding.GetString(operateByteResult.Content);
}
return (true, strVal);
}
default:
return (false, strVal);
}
}
catch (Exception)
{
return (false, strVal);
}
}
///
/// 值写入PLC
///
/// 数据类型
/// 点位地址
/// 值
/// 长度
/// 编码格式
///
public static (bool isOk, string msg) WriteValToPlc(string dataType, string pointAddress, object value, int len = 1, Encoding encoding = null)
{
try
{
if (!isConnected || omronCipNet == null)
{
return (false, "PLC未连接");
}
OperateResult operateResult = new OperateResult
{
IsSuccess = false
};
switch (dataType)
{
case "bool":
operateResult = omronCipNet.Write(pointAddress, Convert.ToBoolean(value));
break;
case "int":
operateResult = omronCipNet.Write(pointAddress, Convert.ToInt32(value));
break;
case "short":
operateResult = omronCipNet.Write(pointAddress, Convert.ToInt16(value));
break;
case "ushort":
operateResult = omronCipNet.Write(pointAddress, Convert.ToUInt16(value));
break;
case "float":
operateResult = omronCipNet.Write(pointAddress, Convert.ToSingle(value));
break;
case "string":
operateResult = omronCipNet.Write(pointAddress, value.ToString(), len, encoding ?? Encoding.ASCII);
break;
case "byte":
var bytes = Encoding.ASCII.GetBytes(value.ToString());
operateResult = omronCipNet.WriteTag(pointAddress, 0xD1, bytes, len);
break;
}
if (operateResult.IsSuccess)
{
return (operateResult.IsSuccess, "操作成功");
}
return (operateResult.IsSuccess, operateResult.Message);
}
catch (Exception ex)
{
return (false, ex.Message);
}
}
///
/// 循环点位地址进行读取
///
///
///
public static List ReadPlcByeWhile(List variables)
{
for (int i = 0; i < variables.Count; i++)
{
var result = GetPlcVal(variables[i].DataType, variables[i].VariableName, variables[i].Offset);
variables.First(m => m.VariableName == variables[i].VariableName).ReadVal = result.val;
}
return variables;
}
}
}