C#winform 基于TCP连接基恩士PLC通讯,与扫码枪通信,扫码枪贴膜追溯系统,RD,RDS,WR,WRS读取等等
项目截图如下
部分通讯代码
///
/// 读取plc的单个数据
///
/// //指定tcp序号
/// 数据类型
/// 软元件类型
/// 软件编号,即地址
/// plc返回的数据
///
public string ReadSingle(TcpLink tcpLink, DataType type, SoftElementType soft, int nAddress)
{
try
{
string Cmd;
string CmdStart = “RD”;
Cmd = CmdStart + " " + soft.ToString() + nAddress.ToString() +
“.” + type.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec.Equals(“E0”))
{
MessageBox.Show(string.Format(“读取软元件{0}时,发生"软元件编号异常"错误”, soft.ToString()), “E0”);
return null;
}
else if (CmdRec.Equals(“E1”))
{
MessageBox.Show(string.Format(“读取软元件{0}时,发生"命令异常"错误”, soft.ToString()), “E1”);
return null;
}
return CmdRec;
}
catch
{
MessageBox.Show((string.Format((“单次读取{0}元件,{1}地址失败”), soft.ToString(), nAddress.ToString())), “提示”, MessageBoxButtons.OKCancel);
return null;
}
}
///
/// 读取单个单字
///
///
///
///
public int ReadSingleWord(TcpLink tcpLink, int nAddress)
{
string s = ReadSingle(tcpLink, DataType.S, SoftElementType.DM, nAddress);
// LogPLC(nAddress.ToString() + “” + s);
return int.Parse(s);
}
public Int16 ReadSingleHex(TcpLink tcpLink, int nAddress)
{
return Int16.Parse(ReadSingle(tcpLink, DataType.H, SoftElementType.DM, nAddress));
}
///
/// 读取多个字
///
///
///
///
///
///
public string[] ReadMulti(TcpLink tcpLink, DataType type, SoftElementType soft, int nAddress, int count)
{
try
{
if (!tcpLink.IsOpen())
{
MessageBox.Show(“网口打开失败!”, “警告”);
}
string Cmd;
string CmdStart = "RDS ";
Cmd = CmdStart + soft.ToString() + nAddress.ToString() +
“.” + type.ToString() + " " + count.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec.Equals(“E0”))
{
MessageBox.Show(string.Format(“读取软元件{0}时,发生"软元件编号异常"错误”, soft.ToString()), “E0”);
return null;
}
else if (CmdRec.Equals(“E1”))
{
MessageBox.Show(string.Format(“读取软元件{0}时,发生"命令异常"错误”, soft.ToString()), “E1”);
return null;
}
return Regex.Split(CmdRec, @"\s+");
}
catch
{
MessageBox.Show((string.Format(("连续读取{0}元件,{1}地址失败"), soft.ToString(), nAddress.ToString())), "提示", MessageBoxButtons.OKCancel);
return null;
}
}
/// <summary>
/// 向R单元读取位数据(0、1),可用于显示io状态
/// </summary>
/// <param name="tcpLink"></param>
/// <param name="nAddress"></param>
/// <returns></returns>
public bool ReadRBit(TcpLink tcpLink, int nAddress)
{
string Cmd;
Cmd = "RD" + " " + SoftElementType.MR.ToString() + nAddress.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec == "1")
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 读取plc的单个数据
/// </summary>
/// //<param name="index">指定tcp序号</param>
/// <param name="type">数据类型</param>
/// <param name="soft">软元件类型</param>
/// <param name="nAddress">软件编号,即地址</param>
/// <param name="PlcSingleData">plc返回的数据</param>
/// <returns></returns>
public string ReadSingle(TcpLink tcpLink, DataType type, SoftElementType soft, int nAddress)
{
try
{
string Cmd;
string CmdStart = "RD";
Cmd = CmdStart + " " + soft.ToString() + nAddress.ToString() +
"." + type.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec.Equals("E0"))
{
MessageBox.Show(string.Format("读取软元件{0}时,发生\"软元件编号异常\"错误", soft.ToString()), "E0");
return null;
}
else if (CmdRec.Equals("E1"))
{
MessageBox.Show(string.Format("读取软元件{0}时,发生\"命令异常\"错误", soft.ToString()), "E1");
return null;
}
return CmdRec;
}
catch
{
MessageBox.Show((string.Format(("单次读取{0}元件,{1}地址失败"), soft.ToString(), nAddress.ToString())), "提示", MessageBoxButtons.OKCancel);
return null;
}
}
/// <summary>
/// 读取单个单字
/// </summary>
/// <param name="tcpLink"></param>
/// <param name="nAddress"></param>
/// <returns></returns>
public int ReadSingleWord(TcpLink tcpLink, int nAddress)
{
string s = ReadSingle(tcpLink, DataType.S, SoftElementType.DM, nAddress);
// LogPLC(nAddress.ToString() + "" + s);
return int.Parse(s);
}
public Int16 ReadSingleHex(TcpLink tcpLink, int nAddress)
{
return Int16.Parse(ReadSingle(tcpLink, DataType.H, SoftElementType.DM, nAddress));
}
/// <summary>
/// 读取多个字
/// </summary>
/// <param name="type"></param>
/// <param name="soft"></param>
/// <param name="nAddress"></param>
/// <param name="count"></param>
/// <returns></returns>
public string[] ReadMulti(TcpLink tcpLink, DataType type, SoftElementType soft, int nAddress, int count)
{
try
{
if (!tcpLink.IsOpen())
{
MessageBox.Show("网口打开失败!", "警告");
}
string Cmd;
string CmdStart = "RDS ";
Cmd = CmdStart + soft.ToString() + nAddress.ToString() +
"." + type.ToString() + " " + count.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec.Equals("E0"))
{
MessageBox.Show(string.Format("读取软元件{0}时,发生\"软元件编号异常\"错误", soft.ToString()), "E0");
return null;
}
else if (CmdRec.Equals("E1"))
{
MessageBox.Show(string.Format("读取软元件{0}时,发生\"命令异常\"错误", soft.ToString()), "E1");
return null;
}
return Regex.Split(CmdRec, @"\s+");
}
catch
{
MessageBox.Show((string.Format(("连续读取{0}元件,{1}地址失败"), soft.ToString(), nAddress.ToString())), "提示", MessageBoxButtons.OKCancel);
return null;
}
}
/// <summary>
/// 向R单元读取位数据(0、1),可用于显示io状态
/// </summary>
/// <param name="tcpLink"></param>
/// <param name="nAddress"></param>
/// <returns></returns>
public bool ReadRBit(TcpLink tcpLink, int nAddress)
{
string Cmd;
Cmd = "RD" + " " + SoftElementType.MR.ToString() + nAddress.ToString();
tcpLink.WriteLine(Cmd);
string CmdRec = null;
tcpLink.ReadLine(out CmdRec);
if (CmdRec == "1")
{
return true;
}
else
{
return false;
}
}