如何用C#往PLC某个端口写数据
我用C#基于SOCKET写了个接口程序,能够实现电脑与电脑间的通信,但往PLC中写数据时,电脑端显示写信息成功,但PLC端接不到数据,为什么呢?我的写数据的代码如下:
建立连接:
public Socket ConnectServer( )
{
Socket s = null;
string errmessage;
try
{
IPAddress ipAddress = IPAddress.Parse ( ip_address );
IPEndPoint ipEndPoint = new IPEndPoint ( ipAddress,port_num );
s = new Socket ( ipEndPoint.AddressFamily ,SocketType.Stream ,ProtocolType.Tcp );
s.Connect ( ipEndPoint );
if ( s.Connected== false )
{
s = null;
}
}
catch ( Exception e ) { errmessage = e.Message ; }
return s;
}
往端口写数据:
socket.Send (buffer,sndLen ,left ,SocketFlags.None );
------解决方案--------------------PLC不都用梯型图么.楼主用C#怎么能运行在PLC上
------解决方案--------------------发送的格式是否有错,不同品牌好象不样的哈,我给你一个参考:
UdpClient PLCUdpClient = new UdpClient();//PLC的UDP连接
/// <param name= "open "> 电源开关,1为开,0为关 </param>
public void OpenPower(int open, string addr)
{
Fins_Send[0] = 128;//&H80;
Fins_Send[1] = 0;// &H0;系统保留
Fins_Send[2] = 2;// &H2;允许的网关数
Fins_Send[3] = 0;// &H0;远程Fins网络地址
Fins_Send[4] = (byte)PLCnod;//远程Fins节点地址31
Fins_Send[5] = 0;// &H0;远程ETN单元地址2
Fins_Send[6] = 0;// &H0;本地网络号2
Fins_Send[7] = (byte)LocNod;// &H20;本地网络节点号32
Fins_Send[8] = 3;// &H3;本地网络单元号 17
Fins_Send[9] = 170;//&HAA;service ID
//设置Fins命令
Fins_Send[10] = 1;// &H1; // 写内存命令
Fins_Send[11] = 2;// &H2; // SRC
//设置Fins参数
Fins_Send[12] = 128;// &H80; //变量区命令DM 82,CIO 80
string addr_ciostr = Convert.ToString(Convert.ToInt32(addr), 16).PadLeft(4, '0 ');
Fins_Send[13] = Convert.ToByte(addr_ciostr.Substring(0, 2), 16); // 写DM区开始地址为DM00
Fins_Send[14] = Convert.ToByte(addr_ciostr.Substring(2, 2), 16);
Fins_Send[15] = 0;// &H0;
Fins_Send[16] = 0;// &H0; //写1个字
Fins_Send[17] = 1;// &H1;
Fins_Send[18] = 0;// &H0;
Fins_Send[19] = (byte)open;// &H1为开,&H0为关
IPEndPoint PLCIPEndPoint = new IPEndPoint(IPAddress.Parse(PLCIP), PLCPort);//PLC控制器IP和端口初始化
PLCUdpClient.Send(Fins_Send, Fins_Send.Length, PLCIPEndPoint);//向PLC控制器发送命令
}
立即成为编程经验丰富的程序员不是梦,详见:http://www.psec.net.cn
------解决方案--------------------mark
学习
------解决方案--------------------感觉在.net上套字总是会有漏的.
观摩学习
------解决方案--------------------UP
------解决方案--------------------呵呵,直接看也能看出是数据类型吧
private byte[] Fins_Send = new byte[20]; //定义一字节数组存储发往下位PLC的Fins命令格式
轻松编程:http://www.psec.net.cn
------解决方案--------------------需要有指令性格式
------解决方案--------------------