三菱FX3U系列PLC网络通信(MC1E帧),封装方法如下:
1.方法一
public class SvMitsubishiMC1E
{
private SvSocketClient Client;
string fbt = "01";//"00";未读//"01"批量读
string plchao = "FF";
string time = "0A00";//L_H
string start = "";
string A_dress = "";
string count = "";
string r_or_w = "";
public override void Initial()
{
base.Initial();
Client = new SvSocketClient(Host, "PLC");
Client.Initial();
}
public override void Close()
{
Client.Close();
}
public override void ReadBlock16(string startAddress, ref short[] addressValues)
{
var addrType = startAddress.Substring(0, 1);
var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));
fbt = "01";
start = startAddr.ToString("X8");
start = start.Substring(6, 2) + start.Substring(4, 2) + start.Substring(2, 2) + start.Substring(0, 2);
A_dress = (GetAddrTypeByte(addrType)).ToString("X4");
A_dress = A_dress.Substring(2, 2) + A_dress.Substring(0, 2);
count = addressValues.Length.ToString("X2");
r_or_w = "00";
string str = string.Format("{0}{1}{2}{3}{4}{5}{6}", fbt, plchao, time, start, A_dress, count, r_or_w);
byte[] OML = new byte[str.Length / 2];
for (int I = 0; I < OML.Length; I++)
{
OML[I] = Convert.ToByte(str.Substring(2 * I, 2), 16);
}
// 發送數據
var recByte = Client.SendData(OML);
// 數據解析
//for (int i = 0; i < addressValues.Length; i++)
//{
// addressValues[i] = BitConverter.ToInt16(recByte, 11 + i * 2);
//}
for (int i = 0; i < addressValues.Length; i++)
{
string SS = recByte[2 * i + 3].ToString("x2").ToUpper();
string FDDS = recByte[2 * i + 2].ToString("x2").ToUpper();
addressValues[i] = Convert.ToInt16(recByte[2 * i + 3].ToString("x2").ToUpper() + recByte[2 * i + 2].ToString("x2").ToUpper(), 16);
}
}
public override void WriteBlock16(string startAddress, short[] addressValues)
{
var addrType = startAddress.Substring(0, 1);
var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));
byte[] bu_write = new byte[addressValues.Length * 2];
for (int i = 0; i < addressValues.Length; i++)
{
bu_write[i * 2] = Convert.ToByte(addressValues[i].ToString("X4").Substring(2, 2), 16);
bu_write[2 * i + 1] = Convert.ToByte(addressValues[i].ToString("X4").Substring(0, 2), 16);
}
fbt = "03";
start = startAddr.ToString("X8");
start = start.Substring(6, 2) + start.Substring(4, 2) + start.Substring(2, 2) + start.Substring(0, 2);
A_dress = (GetAddrTypeByte(addrType)).ToString("X4");
A_dress = A_dress.Substring(2, 2) + A_dress.Substring(0, 2);
count = addressValues.Length.ToString("X2");
r_or_w = "00";
string str = "";
str = string.Format("{0}{1}{2}{3}{4}{5}{6}", fbt, plchao, time, start, A_dress, count, r_or_w);
byte[] buffer = new byte[str.Length / 2 + addressValues.Length * 2];// NEWSystem.Text.Encoding.ASCII.GetBytes(str);
for (int i = 0; i < str.Length / 2 + addressValues.Length * 2; i++)
{
if (i < str.Length / 2)
{
buffer[i] = (byte)Convert.ToByte(str.Substring(i * 2, 2), 16);
}
else
{
buffer[i] = Convert.ToByte(addressValues[(i - str.Length / 2) / 2].ToString("X4").Substring(2, 2), 16);
i++;
buffer[i] = Convert.ToByte(addressValues[(i - 1 - str.Length / 2) / 2].ToString("X4").Substring(0, 2), 16);
}
}
string[] ASD = new string[buffer.Length];
for (int I = 0; I < ASD.Length; I++)
{
ASD[I] = buffer[I].ToString("X2");
}
// 發送數據
var recByte = Client.SendData(buffer);
}
private int GetAddrTypeByte(string addrType)
{
switch (addrType)
{
case "D": return 17440;
case "M": return 19744;
case "R": return 21024;
case "SM": return 145;
default: return 145;
}
}
}
2.方法二
public class SvMitsubishiMC1E
{
private Socket Client;
private string Host;
string fbt = "01";//"00";未读//"01"批量读
string plchao = "FF";
string time = "0A00";//L_H
string start = "";
string A_dress = "";
string count = "";
string r_or_w = "";
public SvMitsubishiMC1E(string host)
{
Host = host;
}
public void Initial()
{
try
{
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Client.SendTimeout = 10000;
Client.ReceiveTimeout = 10000;
Client.Connect(ConvertIP(Host));
}
catch (Exception ex)
{
//SvMaster.Log.WriteError(Name + "建立連接" + Host +