日期:2014-05-19  浏览次数:21006 次

如何用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
------解决方案--------------------
需要有指令性格式

------解决方案--------------------