怎么用C#往PLC某个端口写数据

2024-12-28 11:26:14
推荐回答(3个)
回答1:

这个看你用什么牌子的PLC,物理接口一般都是网口和串口,分别用socket和serialport类。但除了确定物理接口外,不同品牌的PLC会定义不同的通讯协议。欧姆龙PLC会提供通讯协议,发一些byte数组形式的指令完成对PLC指定内存区域数据的读写。倍福的PLC则提供了API可以直接调用。别的牌子我没怎么用过,但是通讯无非就是这两种方式。

回答2:

如果是串口就是serialport
如果是网口就是socket

回答3:

是以太网端口吗?具体什么PLC?

以西门子S7-200Smart与C#通讯为例,代码如下:

Int32 Handle1; //PLC 连接句柄,连接多台PLC时以区分不同的PLC
bool EntLink;//连接标志

//实例化PLC通讯组件:WinTcpS7_Smart.DLL
WinTcpS7_Smart.PlcClient PLC = new WinTcpS7_Smart.PlcClient();

//连接到PLC
public void butLink_Click(System.Object sender, System.EventArgs e)
{
short re = 0;
string restr = "";
re = PLC.EntLink(txtLocalIP.Text.Trim(), Convert.ToUInt16(Conversion.Val(txtLocalPort.Text)), txtRemoteIP.Text.Trim(), Convert.ToUInt16(Conversion.Val(txtRemotePort.Text)), 0, 2, "DEMO", ref Handle1);
txtReLink.Text = re.ToString();
if (re == 0)
{
EntLink = true;
MessageBox.Show("PLC联接成功!");
}
else
{
EntLink = false;
MessageBox.Show("PLC联接失败: " + restr);
}
}


//断开PLC的连接
public void butClose_Click(System.Object sender, System.EventArgs e)
{
        short re;
        EntLink = false;
re = PLC.DeLink(Handle1);
txtReClose.Text = re.ToString();
}


//读取PLC的数据
public void butRead_Click(System.Object sender, System.EventArgs e)
{
short i = 0;
short re;
object[] RD = null;
RD = new object[Convert.ToUInt16(Conversion.Val(double.Parse(txtReadCnt.Text)))];
if (!EntLink)
{
MessageBox.Show("还未与PLC建立联接!");
return;
}
int var1 = cmbReadType.SelectedIndex + 1;//INT16、INT32、REAL32等各种数据类型
        WinTcpS7_Smart.PlcClient.DataType typ = (WinTcpS7_Smart.PlcClient.DataType)var1;
switch (cmbReadMry.SelectedIndex) //读取不同的区域
{
case 0: //I: IBx/IWx/IDx
re = PLC.CmdRead(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DI, typ, Convert.ToUInt16(Conversion.Val(txtReadAdd.Text)), Convert.ToUInt16(Conversion.Val(txtReadCnt.Text)), ref RD);
break;
case 1: //Q: QBx/QWx/QDx
re = PLC.CmdRead(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DQ, typ, Convert.ToUInt16(Conversion.Val(txtReadAdd.Text)), Convert.ToUInt16(Conversion.Val(txtReadCnt.Text)), ref RD);
        break;
case 2: //M: MBx/MWx/MDx
re = PLC.CmdRead(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.MR, typ, Convert.ToUInt16(Conversion.Val(txtReadAdd.Text)), Convert.ToUInt16(Conversion.Val(txtReadCnt.Text)), ref RD);
break;
case 3: //V:VBx/VWx/VDx
re = PLC.CmdRead(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DR, typ, Convert.ToUInt16(Conversion.Val(txtReadAdd.Text)), Convert.ToUInt16(Conversion.Val(txtReadCnt.Text)), ref RD);
break;
}
txtReRead.Text = re.ToString();
//更新显示读取到的数据
lstRead.Items.Clear();
for (i = 0; i <= (RD.Length - 1); i++)
{
if (!(RD[i] == null))
{
lstRead.Items.Add(RD[i]);
}
else
{
lstRead.Items.Add("0");
}
}
}


//数据写入到PLC
public void butWrite_Click(System.Object sender, System.EventArgs e)
{
short i = 0;
short re;
string[] temp = null;
object[] WD = null;
if (!EntLink)
{
MessageBox.Show("还未与PLC建立联接!");
return;
}
WD = new object[Convert.ToUInt16(Conversion.Val(txtWriteCnt.Text))];
//解析要写入到PLC的数据
temp = txtWrite.Text.Split('\n');
for (i = 0; i <= (WD.Length - 1); i++)
{
if (i > (temp.Length - 1))
{
WD[i] = 0;
}
else
{
WD[i] = temp[i].Trim();
}
}
int var1 = cmbWriteType.SelectedIndex + 1;//INT16、INT32、REAL32等各种数据类型
        WinTcpS7_Smart.PlcClient.DataType typ = (WinTcpS7_Smart.PlcClient.DataType)var1;
switch (cmbWriteMry.SelectedIndex)
{
case 0: // I: IBx/IWx/IDx
                        re = PLC.CmdWrite(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DI, typ, Convert.ToUInt16(Conversion.Val(txtWriteAdd.Text)), Convert.ToUInt16(Conversion.Val(txtWriteCnt.Text)), ref WD);
        break;
case 1: // Q: QBx/QWx/QDx
        re = PLC.CmdWrite(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DQ, typ, Convert.ToUInt16(Conversion.Val(txtWriteAdd.Text)), Convert.ToUInt16(Conversion.Val(txtWriteCnt.Text)), ref WD);
break;
case 2: // M: MBx/MWx/MDx
re = PLC.CmdWrite(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.MR, typ, Convert.ToUInt16(Conversion.Val(txtWriteAdd.Text)), Convert.ToUInt16(Conversion.Val(txtWriteCnt.Text)), ref WD);
break;
case 3: // V: VBx/VWx/VDx
re = PLC.CmdWrite(Handle1, WinTcpS7_Smart.PlcClient.PlcMemory.DR, typ, Convert.ToUInt16(Conversion.Val(txtWriteAdd.Text)), Convert.ToUInt16(Conversion.Val(txtWriteCnt.Text)), ref WD);
break;
}
txtReWrite.Text = re.ToString();
}