问题是我是一个PLC工程师,想用写一个上位机程序和三菱FX3U通讯,PLC的IP地址为192.168.0.250,端口号为5551.要求显示X0到X7,输出显示Y0到Y7,还有M0到M9切换按钮,输出格式为直接打开的exe文件
以下是使用C#开发的三菱FX3U上位机通信程序实现方案,包含可直接运行的EXE文件生成方法:
一、开发环境配置
开发工具:
Visual Studio 2022 (社区版)
.NET Framework 4.8
通信参数
NuGet包:Mx.Component.Melsec(三菱协议库)
var config = new MelsecConfiguration {
ProtocolType = ProtocolType.TCP,
Host = "192.168.0.250",
Port = 5551,
CpuType = CpuType.FX3U,
ConnectTimeout = 3000
};
二、界面设计(Windows Forms)
<!-- MainForm.Designer.cs -->
this.Controls.AddRange(new Control[] {
// X0-X7状态指示灯
new StatusLight { Name="x0", Location=new Point(20,20) },
// ...重复创建x1-x7
// Y0-Y7状态显示
new StatusLight { Name="y0", Location=new Point(120,20) },
// ...重复创建y1-y7
// M0-M9切换按钮
new ToggleButton { Name="m0", Text="M0", Location=new Point(220,20) },
// ...创建m1-m9
// 状态栏
new StatusStrip {
Items = {
new ToolStripStatusLabel { Name="lblStatus" }
}
}
});
三、核心通信代码
public partial class MainForm : Form {
private MelsecFxPLC plc;
// 初始化PLC连接
private void ConnectPLC() {
plc = new MelsecFxPLC(config);
var result = plc.Connect();
if (result.IsSuccess) {
timer1.Interval = 500; // 500ms轮询周期
timer1.Start();
}
}
// 定时读取状态
private void timer1_Tick(object sender, EventArgs e) {
// 批量读取X/Y状态
var xStatus = plc.ReadBytes("X0", 1);
var yStatus = plc.ReadBytes("Y0", 1);
// 更新指示灯
UpdateLights(xStatus, "x");
UpdateLights(yStatus, "y");
}
// M按钮点击事件
private void mButton_Click(object sender, EventArgs e) {
var btn = sender as ToggleButton;
plc.WriteBit($"M{btn.Tag}", btn.Checked);
}
}
四、可视化组件类
// 状态指示灯控件
public class StatusLight : PictureBox {
public StatusLight() {
Size = new Size(30, 30);
BackColor = Color.Silver;
}
public bool Active {
set => BackColor = value ? Color.Lime : Color.Red;
}
}
// 切换按钮控件
public class ToggleButton : CheckBox {
public ToggleButton() {
Appearance = Appearance.Button;
TextAlign = ContentAlignment.MiddleCenter;
Size = new Size(50, 30);
}
}
五、项目打包部署
发布设置:
项目属性 → 发布 → 选择"从CD/USB安装"
包含.NET Framework 4.8运行库
生成单文件EXE
依赖文件
├── MelsecFx.dll
├── Newtonsoft.Json.dll
└── Mx.Component.Core.dll
六、协议处理流程图
sequenceDiagram
participant UI as 上位机
participant PLC as FX3U PLC
UI->>PLC: TCP Connect(192.168.0.250:5551)
PLC-->>UI: 连接成功响应
loop 500ms轮询
UI->>PLC: 读取X0-X7(0x00B0命令)
PLC-->>UI: X状态数据
UI->>PLC: 读取Y0-Y7(0x00B0命令)
PLC-->>UI: Y状态数据
end
UI->>PLC: 写入M位(0x1401命令)
PLC-->>UI: 写入确认
七、测试验证步骤
PLC准备:
; 测试程序
LD M8000
MOV K85 K1Y0 // Y0-Y7循环显示
上位机操作检查表: