
界面功能
程序界面包含以下主要功能:
1. 工具栏 :初始化、扫描网络、启动、停止、保存配置、加载配置等按钮
2. 网络状态标签页 :显示网络连接状态和从站信息
3. 从站管理标签页 :管理和监控从站设备
4. PDO配置标签页 :配置和管理PDO映射
5. 实时数据标签页 :显示和监控实时数据
6. 配置管理标签页 :管理配置文件的导入和导出
使用方法
1. 在"网络状态"标签页配置IP地址和端口
2. 点击"初始化"按钮初始化主站
3. 点击"扫描网络"按钮扫描从站
4. 在"从站管理"标签页选择从站并设置状态
5. 在"PDO配置"标签页配置PDO映射
6. 点击"启动"按钮开始数据交换

项目架构

主窗口程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using EthercatMaster.Core;
using EthercatMaster.Configuration;
namespace EthercatMaster.UI;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private EthercatMaster.Core.EthercatMaster ethercatMaster;
private ConfigurationManager configurationManager;
private List<EthercatSlave> slaves;
private NetworkStatus networkStatus;
public MainWindow()
{
InitializeComponent();
InitializeUI();
InitializeEthercatMaster();
UpdateStatus("就绪");
}
private void InitializeUI()
{
// 初始化状态下拉框
cbSlaveState.ItemsSource = Enum.GetValues(typeof(SlaveState));
cbSlaveState.SelectedIndex = 0;
// 初始化更新频率下拉框
cbUpdateRate.SelectedIndex = 2; // 默认100ms
// 初始化网络状态数据
networkStatus = new NetworkStatus();
dgNetworkStatus.Items.Add(networkStatus);
// 初始化从站列表
slaves = new List<EthercatSlave>();
dgSlaves.ItemsSource = slaves;
}
private void InitializeEthercatMaster()
{
try
{
configurationManager = new ConfigurationManager();
string ipAddress = configurationManager.Configuration.Network.IpAddress;
int port = configurationManager.Configuration.Network.Port;
txtIpAddress.Text = ipAddress;
txtPort.Text = port.ToString();
ethercatMaster = new EthercatMaster.Core.EthercatMaster(ipAddress, port);
ethercatMaster.NetworkStatusChanged += OnNetworkStatusChanged;
ethercatMaster.SlaveStateChanged += OnSlaveStateChanged;
ethercatMaster.DataUpdated += OnDataUpdated;
}
catch (Exception ex)
{
UpdateStatus($"初始化失败: {ex.Message}");
}
}
private void btnInitialize_Click(object sender, RoutedEventArgs e)
{
try
{
string ipAddress = txtIpAddress.Text;
int port = int.Parse(txtPort.Text);
ethercatMaster = new EthercatMaster.Core.EthercatMaster(ipAddress, port);
ethercatMaster.NetworkStatusChanged += OnNetworkStatusChanged;
ethercatMaster.SlaveStateChanged += OnSlaveStateChanged;
ethercatMaster.DataUpdated += OnDataUpdated;
bool initialized = ethercatMaster.Initialize();
if (initialized)
{
UpdateStatus("初始化成功");
}
else
{
UpdateStatus("初始化失败");
}
}
catch (Exception ex)
{
UpdateStatus($"初始化失败: {ex.Message}");
}
}
private void btnScanNetwork_Click(object sender, RoutedEventArgs e)
{
try
{
UpdateStatus("正在扫描网络...");
bool scanned = ethercatMaster.ScanNetwork();
if (scanned)
{
UpdateSlaveList();
UpdateStatus("网络扫描完成");
}
else
{
UpdateStatus("网络扫描失败");
}
}
catch (Exception ex)
{
UpdateStatus($"扫描失败: {ex.Message}");
}
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
try
{
Task.Run(() => ethercatMaster.RunMainTask());
UpdateStatus("Ethercat主站已启动");
}
catch (Exception ex)
{
UpdateStatus($"启动失败: {ex.Message}");
}
}
private void btnStop_Click(object sender, RoutedEventArgs e)
{
try
{
ethercatMaster.Shutdown();
UpdateStatus("Ethercat主站已停止");
}
catch (Exception ex)
{
UpdateStatus($"停止失败: {ex.Message}");
}
}
private void btnSaveConfig_Click(object sender, RoutedEventArgs e)
{
try
{
configurationManager.SaveConfiguration();
UpdateStatus("配置已保存");
}
catch (Exception ex)
{
UpdateStatus($"保存配置失败: {ex.Message}");
}
}
private void btnLoadConfig_Click(object sender, RoutedEventArgs e)
{
try
{
configurationManager.LoadConfiguration();
UpdateStatus("配置已加载");
}
catch (Exception ex)
{
UpdateStatus($"加载配置失败: {ex.Message}");
}
}
private void btnConnect_Click(object sender, RoutedEventArgs e)
{
try
{
string ipAddress = txtIpAddress.Text;
int port = int.Parse(txtPort.Text);
ethercatMaster = new EthercatMaster.Core.EthercatMaster(ipAddress, port);
ethercatMaster.NetworkStatusChanged += OnNetworkStatusChanged;
ethercatMaster.SlaveStateChanged += OnSlaveStateChanged;
ethercatMaster.DataUpdated += OnDataUpdated;
bool connected = ethercatMaster.Initialize();
if (connected)
{
UpdateStatus("连接成功");
}
else
{
UpdateStatus("连接失败");
}
}
catch (Exception ex)
{
UpdateStatus($"连接失败: {ex.Message}");
}
}
private void btnSetState_Click(object sender, RoutedEventArgs e)
{
try
{
if (dgSlaves.SelectedItem is EthercatSlave selectedSlave)
{
SlaveState state = (SlaveState)cbSlaveState.SelectedItem;
bool success = ethercatMaster.SetSlaveState(selectedSlave.Address, state);
if (success)
{
UpdateStatus($"从站 {selectedSlave.Address} 状态已设置为 {state}");
}
else
{
UpdateStatus($"设置从站状态失败");
}
}
}
catch (Exception ex)
{
UpdateStatus($"设置状态失败: {ex.Message}");
}
}
private void btnAddPdo_Click(object sender, RoutedEventArgs e)
{
// 实现添加PDO功能
UpdateStatus("添加PDO功能待实现");
}
private void btnRemovePdo_Click(object sender, RoutedEventArgs e)
{
// 实现删除PDO功能
UpdateStatus("删除PDO功能待实现");
}
private void btnExportConfig_Click(object sender, RoutedEventArgs e)
{
try
{
string configFile = txtConfigFile.Text;
configurationManager = new ConfigurationManager(configFile);
configurationManager.SaveConfiguration();
UpdateStatus("配置已导出");
}
catch (Exception ex)
{
UpdateStatus($"导出配置失败: {ex.Message}");
}
}
private void btnImportConfig_Click(object sender, RoutedEventArgs e)
{
try
{
string configFile = txtConfigFile.Text;
configurationManager = new ConfigurationManager(configFile);
configurationManager.LoadConfiguration();
UpdateStatus("配置已导入");
}
catch (Exception ex)
{
UpdateStatus($"导入配置失败: {ex.Message}");
}
}
private void btnApplyConfig_Click(object sender, RoutedEventArgs e)
{
try
{
configurationManager.ApplyConfiguration(ethercatMaster);
UpdateStatus("配置已应用");
}
catch (Exception ex)
{
UpdateStatus($"应用配置失败: {ex.Message}");
}
}
private void dgSlaves_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (dgSlaves.SelectedItem is EthercatSlave selectedSlave)
{
txtSlaveAddress.Text = selectedSlave.Address.ToString();
txtSlaveVendorId.Text = selectedSlave.VendorId.ToString();
txtSlaveProductCode.Text = selectedSlave.ProductCode.ToString();
txtSlaveRevision.Text = selectedSlave.RevisionNumber.ToString();
txtSlaveName.Text = selectedSlave.Name;
cbSlaveState.SelectedItem = selectedSlave.State;
}
}
private void UpdateSlaveList()
{
slaves = ethercatMaster.SlaveManager.GetAllSlaves();
dgSlaves.ItemsSource = slaves;
dgSlaves.Items.Refresh();
// 更新从站下拉框
cbPdoSlave.Items.Clear();
cbDataSlave.Items.Clear();
foreach (var slave in slaves)
{
cbPdoSlave.Items.Add(slave.Address);
cbDataSlave.Items.Add(slave.Address);
}
if (slaves.Count > 0)
{
cbPdoSlave.SelectedIndex = 0;
cbDataSlave.SelectedIndex = 0;
}
}
private void OnNetworkStatusChanged(object sender, NetworkStatus status)
{
Dispatcher.Invoke(() =>
{
networkStatus = status;
dgNetworkStatus.Items.Refresh();
UpdateStatus($"网络状态: {(status.IsOnline ? "在线" : "离线")}, 从站数: {status.SlaveCount}");
});
}
private void OnSlaveStateChanged(object sender, EthercatSlave slave)
{
Dispatcher.Invoke(() =>
{
dgSlaves.Items.Refresh();
if (dgSlaves.SelectedItem is EthercatSlave selectedSlave && selectedSlave.Address == slave.Address)
{
cbSlaveState.SelectedItem = slave.State;
}
});
}
private void OnDataUpdated(object sender, DataUpdateEventArgs e)
{
Dispatcher.Invoke(() =>
{
// 更新实时数据显示
UpdateRealTimeData(e);
});
}
private void UpdateRealTimeData(DataUpdateEventArgs e)
{
// 实现实时数据更新逻辑
}
private void UpdateStatus(string message)
{
txtStatus.Text = $"状态: {message}";
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (ethercatMaster != null)
{
ethercatMaster.Shutdown();
}
}
}

684

被折叠的 条评论
为什么被折叠?



