求助三菱MC协议的VC,VB或者CVI程序通讯实例,3E,4E帧都可以,谢谢?
https://blog.csdn.net/AutoCtrl666/article/details/105919162 这个可以用吗
可以
有人会吗?
@ bosaidongmomo这个经过网关,我要具体的MC协议
https://blog.csdn.net/cmwanysys/article/details/106681255
三菱专用协议官网下载:http://www.doc88.com/p-0873767525202.html
三菱编程口通讯协议(部分寄存器访问)https://www.cnblogs.com/chengcanghai/p/10132862.html
可以借鉴学习
@ soar3033,可以的话用C#做也可以做,要测试稳定
安装MXComponent软件完成后
MELSEC\Act\Samples目录下有Demo,各种语言
只需要通讯协议吗?
协议三菱网站有
协议我知道啊,我也有
//初始化.NET的bai以太网通讯组件EntFxPlc_ADP.DLL
EntFxPlc_ADP.PlcClient PLC = new EntFxPlc_ADP.PlcClient();
bool EntLink; //连接状态标志
Int32 PlcHand; //PLC 的连接句柄,对应不同的PLC或者一台PLC的多个连接
//按钮事件,建立与LC的以太网连接
public void butLink_Click(System.Object sender, System.EventArgs e)
{
short re = 0;
string restr = "";
re = PLC.EntLink(txtLocalIP.Text.Trim(), Convert.ToUInt16(txtLocalPort.Text), txtRemoteIP.Text.Trim(), (Convert.ToUInt16(txtRemotePort.Text)), "DEMO", ref PlcHand, Convert.ToUInt16(1000),Convert .ToBoolean (cmbCmdType .SelectedIndex ));
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 = 0;
re = PLC.DeLink(PlcHand);
txtReClose.Text = re.ToString();
EntLink = false;
}
//按钮事件,读取PLC的数据
public void butRead_Click(System.Object sender, System.EventArgs e)
{
short i = 0;
short re = 0;
object[] RD = null;
RD = new object[Convert.ToUInt16(txtReadCnt.Text)];
if (!EntLink)
{
MessageBox.Show("还未与PLC建立联接!");
return;
}
int var1 = cmbReadType.SelectedIndex + 1;
EntFxPlc_ADP.PlcClient.DataType typ = (EntFxPlc_ADP.PlcClient.DataType)var1;
switch (cmbReadMry.SelectedIndex)
{
case 0:
re = PLC.CmdRead(PlcHand,EntFxPlc_ADP.PlcClient.PlcMemory.DI, typ, Convert.ToUInt16(txtReadAdd.Text), Convert.ToUInt16(txtReadCnt.Text), ref RD);
break;
case 1:
re = PLC.CmdRead(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.DQ, typ, Convert.ToUInt16(txtReadAdd.Text), Convert.ToUInt16(txtReadCnt.Text), ref RD);
break;
case 2:
re = PLC.CmdRead(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.MR, typ, Convert.ToUInt16(txtReadAdd.Text), Convert.ToUInt16(txtReadCnt.Text), ref RD);
break;
case 3:
re = PLC.CmdRead(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.DR, typ, Convert.ToUInt16(txtReadAdd.Text), Convert.ToUInt16(txtReadCnt.Text), ref RD);
break;
case 4:
re = PLC.CmdRead(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.RR, typ, Convert.ToUInt16(txtReadAdd.Text), Convert.ToUInt16(txtReadCnt.Text), ref RD);
break;
}
txtReRead.Text = re.ToString();
lstRead.Items.Clear();
for (i = 0; i < RD.Length ; 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 = 0;
string[] temp = null;
object[] WD = null;
if (!EntLink)
{
MessageBox.Show("还未与PLC建立联接!");
return;
}
WD = new object[Convert.ToUInt16(txtWriteCnt.Text)];
temp = txtWrite.Text.Split('\n');
for (i = 0; i < WD.Length ; i++)
{
if (i >= temp.Length )
{
WD[i] = 0;
}
else
{
WD[i] = temp[i].Trim();
}
}
int var1 = cmbWriteType.SelectedIndex + 1;
EntFxPlc_ADP.PlcClient.DataType typ = (EntFxPlc_ADP.PlcClient.DataType)var1;
switch (cmbWriteMry.SelectedIndex)
{
case 0:
re = PLC.CmdWrite(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.DI, typ, Convert.ToUInt16(txtWriteAdd.Text), Convert.ToUInt16(txtWriteCnt.Text), ref WD);
break;
case 1:
re = PLC.CmdWrite(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.DQ, typ, Convert.ToUInt16(txtWriteAdd.Text), Convert.ToUInt16(txtWriteCnt.Text), ref WD);
break;
case 2:
re = PLC.CmdWrite(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.MR, typ, Convert.ToUInt16(txtWriteAdd.Text), Convert.ToUInt16(txtWriteCnt.Text), ref WD);
break;
case 3:
re = PLC.CmdWrite(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.DR, typ, Convert.ToUInt16(txtWriteAdd.Text), Convert.ToUInt16(txtWriteCnt.Text), ref WD);
break;
case 4:
re = PLC.CmdWrite(PlcHand, EntFxPlc_ADP.PlcClient.PlcMemory.RR, typ, Convert.ToUInt16(txtWriteAdd.Text), Convert.ToUInt16(txtWriteCnt.Text), ref WD);
break;
}
txtReWrite.Text = re.ToString();
}
https://download.csdn.net/download/bill20100829/14977845
最近几天在做C#代码与三菱Q系列PLC TCP通信(MC模式)读写数据寄存器的功能,留此调试文档。
三菱Q系列PLC通信协议有很多种,本次选择了MC,MC内发送数据有ASCII方式和二进制方式,通信模块有内置以太网模块(与CPU一起)和以太网扩展模块,不同的模块设置参数的方式同,本次使用的是内置式的,
MC的协议方式有A-1E模式和Qna-3E模式、Qna-4E模式,尝试了前两种;A-1E为较早的通信版本,对地址的操作范围有限(数据寄存器区的D0~D6143、D9000~D9255),Qna-3E可访问D0~D12287数据
A-1E协议:
Qna-3E协议:
二进制方式
ASCII方式
请求数据长度计算为之后的所有数据,二进制方式两个数字为一个字,ASCII为一个数字一个字,二进制发送时数据的高低位需要调换,ASCII发送带字母起始地址式会返回错误(待解决)。
数据回复
异常回复:0b 00 5b c0 00 ff ff 03 00 01 14 00 00
成功回复:d0 00 00 ff ff 03 00 02 00 00 00
字符串转换为二进制数据:
byte[] bytes = new byte[str.Length / 2];
for (int i = 0; i < str.Length; i += 2)
bytes[i / 2] = (byte)Convert.ToByte(str.Substring(i, 2), 16);
private void SocketConnect()//连接
{
try
{
socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket1.Connect("192.168.0.3", 5002);//三菱MC协议IP地址和端口,根据实际情况修改
connect = true;
MessageBox.Show("连接成功!");
}
catch (Exception ex) { MessageBox.Show("无法建立连接,请检查IP和端口是否正确"); }
try
{
socket1.Close();
}
catch
{
}
try { socket1.Dispose(); }
catch { }
}
socket1.Send(command);//发送数据
d
sadfasdfsadfdsf
https://wenku.baidu.com/view/eea0b23833687e21ae45a96b.html 这个可以帮助你吗
这个没用