命名空间:netMarketing.automation.plc.OmronPlcNet
功能:OmronPlc基于tcp的Fins读写类。可用NJ系列,CP1H系列的欧姆龙PLC
功能详细说明:
OmronPlcNet类是基于tcp的Fins通讯类。可用NJ系列,CP1H系列的欧姆龙PLC。
常用函数列表:
/// 构造函数 public OmronPlcNet(Byte clientNode, Byte serverNode) /// 初始化plc端口连接 public bool InitPort(string IpAdrr, int Port) /// 关闭连接 public void Close() /// plc是否连接上了 public bool IsConnected /// plc握手协议 public bool Handshake() /// 重新连接plc public bool ReConneting() /// 读数据,double型 public Double[] ReadDouble(UInt16 startAdrr, UInt16 readLength, Byte AreaType) /// 写数据,double型 public bool WriteDouble(UInt16 startAdrr, Byte AreaType, params Double[] doubleData) /// 读字符串 public string ReadString(UInt16 startAdrr, UInt16 readLength) /// 读数据,Single型 public Single[] ReadSingles(UInt16 startAdrr, UInt16 readLength, Byte AreaType) /// 写数据,single型 public bool WriteSingles(UInt16 startAdrr, Byte AreaType, params Single[] singleData) /// 读数据,int16型 public Int16[] ReadInt16(UInt16 startAdrr, UInt16 readLength, Byte AreaType) /// 写字符串 public bool WriteString(UInt16 startAdrr, params byte[] byteData) /// 写数据,int16型 public bool WriteInt16(UInt16 startAdrr, Byte AreaType, params Int16[] Int16Data) /// 读数据, int32型 public Int32[] ReadInt32(UInt16 startAdrr, UInt16 readLength, Byte AreaType) /// 写数据, int32型 public bool WriteInt32(UInt16 startAdrr, Byte AreaType, params Int32[] Int32Data) /// 读位, 返回bool型 public Boolean[] ReadBits(UInt16 startAdrr, Byte bitNo, UInt16 readLength, Byte AreaType) /// 写位 public bool WriteBits(UInt16 startAdrr, Byte bitNo, Byte AreaType, params Boolean[] BoolenData)
示例程序:
下面的例子是对上面OmronPlcNet类的一个二次封装应用的例子。
/// <summary>
/// PLC对象
/// </summary>
public class OmronPlcObj
{
//节点号可以任意,创建一个实例用于读取,另一个用于写操作
private static OmronPlcNet omrRead = new OmronPlcNet(0xD6, 0x01);
private static OmronPlcNet omrWrite = new OmronPlcNet(0xD5, 0x01);
private configSetting sysConfig = null;
private WorkSetting workConfig = null;
public OmronPlcObj(configSetting data, WorkSetting data2)
{
this.sysConfig = data;
this.workConfig = data2;
}
public void Close()
{
omrRead.Close();
omrWrite.Close();
}
public OmronPlcNet returnPlcReadObj()
{
return omrRead;
}
public OmronPlcNet returnPlcWriteObj()
{
return omrWrite;
}
/// <summary>
/// plcRead初始化
/// <para>异常:ArgumentException</para>
/// </summary>
/// <returns></returns>
public bool initRead()
{
bool f1 = true;
if (sysConfig.vitualPlc) { return true; }
if (!omrRead.InitPort(sysConfig.plcIP, sysConfig.plcPort))
{
f1 = false;
}
if (!f1) throw new ArgumentException("连接PLC_Read 失败!");
return f1;
}
/// <summary>
/// plcWrite初始化
/// <para>异常:ArgumentException</para>
/// </summary>
/// <returns></returns>
public bool initWrite()
{
//如果plcWrite的IP与plcRead的IP设置得一样,则plcWrite对象指向plcRead对象.
//即两者变成一个对象, plcRead即负责读与负责写
//因为从实际连接效果来看, 如果plcRead, plcWrite连接同一个IP与端口, 经常会连接失败
bool f1 = true;
if (sysConfig.plcIP.Equals(sysConfig.plcIPWRite))
omrWrite = omrRead;
else
{
if (sysConfig.vitualPlc) { return true; }
if (!omrWrite.InitPort(sysConfig.plcIPWRite, sysConfig.plcPortWRite))
{
f1 = false;
}
if (!f1) throw new ArgumentException("连接PLC_Write 失败!");
}
return f1;
}
/// <summary>
/// 读plc int
/// </summary>
/// <param name="startAddr"></param>
/// <param name="len"></param>
/// <returns></returns>
public int[] readInt(ushort startAddr,ushort len=1)
{
if (sysConfig.vitualPlc) { return new int[] { 0 }; }
return omrRead.ReadInt16(startAddr, len, OmronPlcNet.DM_W).ToList().ConvertAll(s => (int)s).ToArray();
}
public bool writeInt(ushort startAddr,short[] data, ushort len=1)
{
if (sysConfig.vitualPlc) { return true; }
return omrWrite.WriteInt16(startAddr, OmronPlcNet.DM_W, data);
}
/// <summary>
/// 读PLC字符串
/// <para>异常:Exception</para>
/// </summary>
/// <param name="startAddr"></param>
/// <param name="len"></param>
/// <returns></returns>
public string readString(ushort startAddr, ushort len)
{
try
{
if (sysConfig.vitualPlc || sysConfig.vitualScaner) { return randomHelper.GenerateRndNumLetter(workConfig.productSNlength); }
if (startAddr == 0) return string.Empty;
var ary1 = omrRead.ReadInt16(startAddr, (ushort)(workConfig.productSNlength / 2), OmronPlcNet.DM_W);
var sb1 = new StringBuilder();
foreach (var m in ary1)
{
var v = ConvertHelper.ConvertBase(m, 10, 16);
sb1.Append((char)(ConvertHelper.ToInt32((ConvertHelper.ConvertBase(v.LeftStr(2), 16, 10)), 0)));
sb1.Append((char)(ConvertHelper.ToInt32((ConvertHelper.ConvertBase(v.RightStr(2), 16, 10)), 0)));
}
return sb1.ToString();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 写PLC字符串
/// <para>异常:Exception</para>
/// </summary>
/// <param name="startAddr"></param>
/// <param name="str"></param>
/// <returns></returns>
public bool writeString(ushort startAddr, string str)
{
try
{
if (sysConfig.vitualPlc) { return true; }
if (startAddr == 0) return false;
var ary1 = Encoding.UTF8.GetBytes(str).ToList();
if (ary1.Count % 2 != 0)
{
ary1.Add(0);
}
var list1 = new List<short>();
for (int i = 0; i < ary1.Count; i += 2)
{
list1.Add(
short.Parse(
ConvertHelper.ConvertBase(
ConvertHelper.ConvertBase(ary1[i], 10, 16) +
ConvertHelper.ConvertBase(ary1[i + 1], 10, 16), 16, 10))
);
}
return omrWrite.WriteInt16(startAddr, OmronPlcNet.DM_W, list1.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
}---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:



少有人走的路



















