public class OmronPLC
{
Socket socketclient = null;
static string[] sPCIP;
static string[] sPLCIP;
private static object lock1= new object();
/// <summary>
///
/// </summary>
/// <param name="position"></param>
/// <param name="data"></param>
/// <param name="count"></param>
/// <returns></returns>
public bool WriteDMs(ushort position, ref ushort[] data, ushort count)
{
bool back = false;
string Header = "46494E53000000";
string Length = (26 + count * 2).ToString("X2");
string GCT = "000000020000000080000200";
string DA1 = int.Parse(sPCIP[3]).ToString("X2");
string space = "0000";
string DA2 = int.Parse(sPLCIP[3]).ToString("X2");
string Command = "00FF010282";
string sPosition = position.ToString("X4");
string sCount = count.ToString("X6");
string[] sData = new string[count];
for (int i = 0; i < count; i++)
{
sData[i] = data[i].ToString("X4");
}
string stData = string.Join("", sData);
string sCommend = Header + Length + GCT + DA2 + space + DA1 + Command + sPosition + sCount + stData;
ClientSendMsg(sCommend);
string callback = recv();
string backOK = "46494E53000000160000000200000000C0000200" + DA1 + "0000" + DA2 + "00FF01020000";
if (callback == backOK)
{
back = true;
}
return back;
}
public bool ReadDMs(ushort position, ref ushort[] data, ushort count)
{
bool back = false;
string Header = "46494E530000001A000000020000000080000200";
string DA1 = int.Parse(sPCIP[3]).ToString("X2");
string space = "0000";
string DA2 = int.Parse(sPLCIP[3]).ToString("X2");
string Command = "00FF010182";
string sPosition = position.ToString("X4");
string sCount = count.ToString("X6");
string sCommend = Header + DA2 + space + DA1 + Command + sPosition + sCount;
string backdata = null;
string[] sdata = new string[data.Length];
ClientSendMsg(sCommend);
string sbackdata = recv();
if (sbackdata!= "ERR")
{
string callback = sbackdata.Substring(14, 2);
string backOK = (22 + count * 2).ToString("X2");
if (callback == backOK)
{
back = true;
backdata = sbackdata.Substring(60, count * 4);
for (int i = 0; i < count; i++)
{
sdata[i] = backdata.Substring(i * 4, 4);
data[i] = Convert.ToUInt16(sdata[i], 16);
}
}
}
return back;
}
/// <summary>
///
/// </summary>
/// <param name="PLCIP"></param>
/// <param name="PLCPort"></param>
/// <param name="PCIP"></param>
/// <param name="PCPort"></param>
/// <returns></returns>
public string Connect(string PLCIP, int PLCPort, string PCIP, int PCPort)
{
string back = "NG";
string hand = "46494E530000000C0000000000000000000000";
sPCIP = PCIP.Split(new char[] { '.' });
sPLCIP = PLCIP.Split(new char[] { '.' });
string DA1 = int.Parse(sPCIP[3]).ToString("X2");
string DA2 = int.Parse(sPLCIP[3]).ToString("X2");
hand += DA1;
socketclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
if (!socketclient.Connected)
socketclient.Connect(new IPEndPoint(IPAddress.Parse(PLCIP), PLCPort));
ClientSendMsg(hand);
}
catch (Exception ex)
{
back = "ScoketErr";
return back;
}
string callback = recv();
string backOK = "46494E53000000100000000100000000000000" + DA1 + "000000" + DA2;
if (callback == backOK)
{
back = "OK";
}
else
{
back = "HandErr";
socketclient.Dispose();
}
return callback;
}
void ClientSendMsg(string sendMsg)
{
//将输入的内容字符串转换为机器可以识别的字节数组
// byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
lock (lock1)
{
if (sendMsg != null)
{
byte[] arrClientSendMsg = new byte[sendMsg.Length / 2];
for (int i = 0; i < sendMsg.Length / 2; i++)
{
arrClientSendMsg[i] = Convert.ToByte(sendMsg.Substring(i * 2, 2), 16);
}
//调用客户端套接字发送字节数组
if (socketclient.Connected)
socketclient.Send(arrClientSendMsg);
}
}
}
string recv()
{
lock (lock1)
{
int length = 0;
string callback = "ERR";
try
{
//定义一个1M的内存缓冲区,用于临时性存储接收到的消息
byte[] arrRecvmsg = new byte[1024 * 1024];
//将客户端套接字接收到的数据存入内存缓冲区,并获取长度
if (socketclient.Connected)
{
length = socketclient.Receive(arrRecvmsg);
string hexString = null;
if (length != 0)
{
for (int i = 0; i < length; i++)
{
hexString += (arrRecvmsg[i].ToString("x2"));
}
callback = hexString.ToUpper();//转大写
//将套接字获取到的字符数组转换为人可以看懂的字符串
}
}
else
{
callback = "ERR";
}
}
catch (Exception ex)
{
callback = "ERR";
}
return callback;
}
//}
}
}