Commit 3e6eede0 LN

文档优化

1 个父辈 6ba77d49
...@@ -4,317 +4,194 @@ ...@@ -4,317 +4,194 @@
| 项目 | 内容 | | 项目 | 内容 |
|------|------| |------|------|
| 版本 | 1.0.0 | | 版本 | 1.1.0 |
| 状态 | 正式版 | | 状态 | 正式版 |
| 编写日期 | 2025-12-16 | | 编写日期 | 2025-12-18 |
| 最后更新 | 2025-12-16 | | 最后更新 | 2025-12-18 |
| 编写人 | SISO 开发团队 | | 编写人 | MIMO 开发团队 |
## 更新日志 ## 更新日志
| 版本 | 日期 | 更新内容 | 编写人 | | 版本 | 日期 | 更新内容 | 编写人 |
|------|------|----------|--------| |------|------|----------|--------|
| 1.0.0 | 2025-12-16 | 初始版本,包含轴管理器接口、轴控制方法、数据结构和异常处理 | SISO 开发团队 | | 1.1.0 | 2025-12-18 | 根据实际代码更新接口定义和AxisBean说明 | MIMO 开发团队 |
| 1.0.0 | 2025-12-16 | 初始版本 | MIMO 开发团队 |
## 1. 概述 ## 1. 概述
本文档详细介绍了 SISO 系统中轴控制相关的 API 接口,包括轴管理器接口、轴控制方法以及相关数据结构。这些 API 提供了对运动轴的初始化、控制、状态监控等功能的抽象和实现。 本文档详细介绍了 MIMO 系统中轴控制相关的 API 接口,主要包括 `IAxisManager` 接口和 `AxisBean` 封装类。这些 API 提供了对运动轴的初始化、控制、状态监控等功能的抽象和实现。
## 2. 轴管理器接口 ## 2. 轴管理器接口
### 2.1 IAxisManager 接口 ### 2.1 IAxisManager 接口
`IAxisManager` 是轴控制模块的核心接口,定义了对运动轴进行管理和控制的基本操作。 `IAxisManager` 是轴控制模块的核心接口,定义了对运动轴进行底层控制的基本操作。
```csharp ```csharp
public interface IAxisManager namespace DeviceLibrary
{ {
#region 初始化与关闭 public interface IAxisManager
{
/// <summary> /// <summary>
/// 初始化轴管理器 /// 检查轴是否使能
/// </summary> /// </summary>
/// <returns>初始化是否成功</returns> bool IsServeoOn(string portName, short slvAddr);
bool Initialize();
/// <summary>
/// <summary> /// 打开板卡/控制器
/// 使用指定配置初始化轴管理器 /// </summary>
/// </summary> bool OpenCard();
/// <param name="configPath">配置文件路径</param>
/// <returns>初始化是否成功</returns> /// <summary>
bool Initialize(string configPath); /// 关闭板卡/控制器
/// </summary>
/// <summary> bool CloseCard();
/// 关闭轴管理器,释放资源
/// </summary> /// <summary>
void Close(); /// 检查回零是否完成
/// </summary>
#endregion bool IsHomeMoveEnd(string portName, short slvAddr);
#region 轴信息获取 /// <summary>
/// 检查绝对运动是否完成
/// <summary> /// </summary>
/// 获取所有轴的信息 bool AbsMoveIsEnd(string portName, short axisNo, int targetPosition, int canErrorCount, out bool countError);
/// </summary>
/// <returns>轴信息列表</returns> /// <summary>
List<AxisBean> GetAllAxes(); /// 伺服开启
/// </summary>
/// <summary> void ServoOn(string portName, short slvAddr);
/// 根据轴ID获取轴信息
/// </summary> /// <summary>
/// <param name="axisId">轴ID</param> /// 伺服关闭
/// <returns>轴信息对象,如果未找到返回null</returns> /// </summary>
AxisBean GetAxisById(int axisId); void ServoOff(string portName, short slvAddr);
/// <summary> /// <summary>
/// 获取轴的当前状态 /// 相对运动
/// </summary> /// </summary>
/// <param name="axisId">轴ID</param> void RelMove(string portName, short slvAddr, int position, int targetSpeed, int ptpAcc, int ptpDec);
/// <returns>轴状态枚举值</returns>
AxisStatus GetAxisStatus(int axisId); /// <summary>
/// 回零运动
/// <summary> /// </summary>
/// 获取轴的当前位置 bool HomeMove(string portName, short slvAddr, int highVel, int lowVel, int acc);
/// </summary>
/// <param name="axisId">轴ID</param> /// <summary>
/// <returns>轴的当前位置值</returns> /// 速度模式运动
double GetAxisCurrentPosition(int axisId); /// </summary>
void SpeedMove(string portName, short slvAddr, int speed, int acc, int dec);
/// <summary>
/// 获取轴的当前速度 /// <summary>
/// </summary> /// 急停
/// <param name="axisId">轴ID</param> /// </summary>
/// <returns>轴的当前速度值</returns> void SuddenStop(string portName, short slvAddr);
double GetAxisCurrentSpeed(int axisId);
/// <summary>
#endregion /// 判断是否到位
/// </summary>
#region 运动控制 bool isInPosition(string portName, short slvAddr, int PPosition, int canErrorCount, bool isLog = false);
/// <summary> /// <summary>
/// 控制轴点动 /// 绝对运动
/// </summary> /// </summary>
/// <param name="axisId">轴ID</param> void AbsMove(string portName, short slvAddr, int targetPosition, int targetSpeed, int ptpAcc, int ptpDec);
/// <param name="speed">点动速度</param>
/// <param name="isPositive">是否正方向</param> /// <summary>
/// <returns>操作是否成功</returns> /// 清除报警
bool MoveAxisJog(int axisId, double speed, bool isPositive); /// </summary>
void AlarmClear(string portName, short slvAddr);
/// <summary>
/// 停止指定轴的运动 /// <summary>
/// </summary> /// 获取目标位置
/// <param name="axisId">轴ID</param> /// </summary>
/// <returns>操作是否成功</returns> int GetTargetPosition(string portName, short slvAddr);
bool StopAxis(int axisId);
/// <summary>
/// <summary> /// 获取实际位置
/// 停止所有轴的运动 /// </summary>
/// </summary> int GetActualtPosition(string portName, short slvAddr);
/// <returns>操作是否成功</returns>
bool StopAllAxes(); /// <summary>
/// 获取报警状态
/// <summary> /// </summary>
/// 控制轴进行相对运动 int GetAlarmStatus(string portName, short slvAddr);
/// </summary>
/// <param name="axisId">轴ID</param> /// <summary>
/// <param name="distance">相对运动距离</param> /// 获取忙状态
/// <param name="speed">运动速度</param> /// </summary>
/// <returns>操作是否成功</returns> int GetBusyStatus(string portName, short slvAddr);
bool MoveAxisRelative(int axisId, double distance, double speed);
/// <summary>
/// <summary> /// 获取回零结束状态
/// 控制轴进行绝对运动 /// </summary>
/// </summary> int GetHomeEndStatus(string portName, short slvAddr);
/// <param name="axisId">轴ID</param>
/// <param name="position">目标位置</param> /// <summary>
/// <param name="speed">运动速度</param> /// 获取原点信号
/// <returns>操作是否成功</returns> /// </summary>
bool MoveAxisAbsolute(int axisId, double position, double speed); int GetHomeSingle(string portName, short slvAddr);
/// <summary> /// <summary>
/// 控制轴回零 /// 获取负极限信号
/// </summary> /// </summary>
/// <param name="axisId">轴ID</param> int GetLimitNegativeSingle(string portName, short slvAddr);
/// <returns>操作是否成功</returns>
bool HomeAxis(int axisId); /// <summary>
/// 获取正极限信号
/// <summary> /// </summary>
/// 控制轴回零(带参数) int GetLimitPositiveSingle(string portName, short slvAddr);
/// </summary>
/// <param name="axisId">轴ID</param> int AxisStsINP(string portName, short slvAddr);
/// <param name="homeMode">回零模式</param>
/// <param name="homeSpeed">回零速度</param> short GetErrorCode(string portName, short slvAddr);
/// <returns>操作是否成功</returns> }
bool HomeAxis(int axisId, HomeMode homeMode, double homeSpeed);
/// <summary>
/// 多轴同步运动(绝对位置)
/// </summary>
/// <param name="targetPositions">各轴目标位置映射表,key为轴ID,value为目标位置</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
bool MoveMultipleAxesSynchronously(Dictionary<int, double> targetPositions, double speed);
/// <summary>
/// 多轴同步运动(绝对位置,带加速度和减速度)
/// </summary>
/// <param name="targetPositions">各轴目标位置映射表,key为轴ID,value为目标位置</param>
/// <param name="speed">运动速度</param>
/// <param name="acceleration">加速度</param>
/// <param name="deceleration">减速度</param>
/// <returns>操作是否成功</returns>
bool MoveMultipleAxesSynchronously(Dictionary<int, double> targetPositions, double speed, double acceleration, double deceleration);
/// <summary>
/// 多轴同步相对运动
/// </summary>
/// <param name="relativeDistances">各轴相对运动距离映射表,key为轴ID,value为相对距离</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
bool MoveMultipleAxesSynchronouslyRelative(Dictionary<int, double> relativeDistances, double speed);
/// <summary>
/// 等待所有指定轴运动完成
/// </summary>
/// <param name="axisIds">轴ID列表,若为null或空则等待所有轴</param>
/// <param name="timeout">超时时间(毫秒),0表示无限等待</param>
/// <returns>是否在超时前完成运动</returns>
bool WaitForMotionCompletion(List<int> axisIds = null, int timeout = 0);
#endregion
#region 参数设置
/// <summary>
/// 设置轴的位置值(直接修改系统中的位置值,非运动命令)
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="position">要设置的位置值</param>
/// <returns>操作是否成功</returns>
bool SetAxisPosition(int axisId, double position);
/// <summary>
/// 设置轴的最大速度
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="maxSpeed">最大速度值</param>
/// <returns>操作是否成功</returns>
bool SetAxisMaxSpeed(int axisId, double maxSpeed);
/// <summary>
/// 设置轴的加速度
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="acceleration">加速度值</param>
/// <returns>操作是否成功</returns>
bool SetAxisAcceleration(int axisId, double acceleration);
/// <summary>
/// 设置轴的减速度
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="deceleration">减速度值</param>
/// <returns>操作是否成功</returns>
bool SetAxisDeceleration(int axisId, double deceleration);
#endregion
#region 事件处理
/// <summary>
/// 注册轴状态变化事件处理器
/// </summary>
/// <param name="handler">事件处理函数</param>
void RegisterAxisStatusChangeHandler(Action<int, AxisStatus> handler);
/// <summary>
/// 注册轴位置到达事件处理器
/// </summary>
/// <param name="handler">事件处理函数</param>
void RegisterAxisPositionReachedHandler(Action<int> handler);
#endregion
} }
``` ```
## 3. 数据结构 ## 3. 轴对象封装 (AxisBean)
`AxisBean` 类是对 `IAxisManager` 的高级封装,提供了更易用的面向对象接口,包含了轴的配置信息和状态管理。
### 3.1 AxisBean 类 ### 3.1 核心属性
`AxisBean` 类用于表示轴的属性和状态信息。 - `ConfigMoveAxis Config`: 轴配置信息对象
- `string AxisName`: 轴名称
- `int LastPosition`: 上次记录的位置
- `bool IsBusy`: 轴是否忙碌
- `bool IsServeoOn`: 轴是否使能
### 3.2 主要方法
```csharp ```csharp
public class AxisBean public class AxisBean
{ {
/// <summary> // 构造函数
/// 轴ID public AxisBean(ConfigMoveAxis axisConfig, string deviceName, int maxSensorValue = 0);
/// </summary>
public int Id { get; set; } // 打开轴(使能)
public bool Open(bool isCheck, out string Msg);
/// <summary>
/// 轴名称 // 关闭轴(去使能)
/// </summary> public void ServoOff();
public string Name { get; set; }
// 回零运动
/// <summary> public void HomeMove(MoveInfo MoveInfo, bool force = true);
/// 当前位置
/// </summary> // 绝对运动
public double CurrentPosition { get; set; } public void AbsMove(MoveInfo MoveInfo, int targetPosition, int targetSpeed);
/// <summary> // 速度运动
/// 目标位置 public void SpeedMove(int targetSpeed);
/// </summary>
public double TargetPosition { get; set; } // 急停
public void SuddenStop();
/// <summary>
/// 当前速度 // 检查是否到位
/// </summary> public bool IsInPosition(int targetP);
public double CurrentSpeed { get; set; }
// 获取当前位置
/// <summary> public int GetAclPosition();
/// 最大速度
/// </summary>
public double MaxSpeed { get; set; }
/// <summary>
/// 加速度
/// </summary>
public double Acceleration { get; set; }
/// <summary>
/// 减速度
/// </summary>
public double Deceleration { get; set; }
/// <summary>
/// 轴状态
/// </summary>
public AxisStatus Status { get; set; }
/// <summary>
/// 是否已回零
/// </summary>
public bool IsHomed { get; set; }
/// <summary>
/// 是否处于报警状态
/// </summary>
public bool IsInAlarm { get; set; }
/// <summary>
/// 正向限位状态
/// </summary>
public bool PositiveLimit { get; set; }
/// <summary>
/// 负向限位状态
/// </summary>
public bool NegativeLimit { get; set; }
/// <summary>
/// 原点信号状态
/// </summary>
public bool HomeSignal { get; set; }
} }
``` ```
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## 1. 概述 ## 1. 概述
DeviceLibrary 是 SISO 系统中的设备控制层核心库,提供了统一的设备抽象和控制接口,支持各类工业设备的接入和控制。本文档详细介绍了 DeviceLibrary 提供的主要 API 接口及其使用方法。 DeviceLibrary 是 MIMO 系统中的设备控制层核心库,提供了统一的设备抽象和控制接口,支持各类工业设备的接入和控制。本文档详细介绍了 DeviceLibrary 提供的主要 API 接口及其使用方法。
## 2. 核心接口 ## 2. 核心接口
...@@ -14,49 +14,29 @@ DeviceLibrary 是 SISO 系统中的设备控制层核心库,提供了统一的 ...@@ -14,49 +14,29 @@ DeviceLibrary 是 SISO 系统中的设备控制层核心库,提供了统一的
public interface IAxisManager public interface IAxisManager
{ {
/// <summary> /// <summary>
/// 初始化轴管理器 /// 检查轴是否使能
/// </summary> /// </summary>
bool Initialize(); bool IsServeoOn(string portName, short slvAddr);
/// <summary>
/// 关闭轴管理器
/// </summary>
void Close();
/// <summary>
/// 获取所有轴的信息
/// </summary>
List<AxisBean> GetAllAxes();
/// <summary>
/// 按轴ID获取轴信息
/// </summary>
AxisBean GetAxisById(int axisId);
/// <summary>
/// 控制指定轴点动
/// </summary>
bool MoveAxisJog(int axisId, double speed, bool isPositive);
/// <summary> /// <summary>
/// 停止指定轴运动 /// 打开板卡/控制器
/// </summary> /// </summary>
bool StopAxis(int axisId); bool OpenCard();
/// <summary> /// <summary>
/// 设置轴位置 /// 关闭板卡/控制器
/// </summary> /// </summary>
bool SetAxisPosition(int axisId, double position); bool CloseCard();
/// <summary> /// <summary>
/// 轴回零 /// 回零运动
/// </summary> /// </summary>
bool HomeAxis(int axisId); bool HomeMove(string portName, short slvAddr, int highVel, int lowVel, int acc);
/// <summary> /// <summary>
/// 获取轴状态 /// 绝对运动
/// </summary> /// </summary>
AxisStatus GetAxisStatus(int axisId); void AbsMove(string portName, short slvAddr, int targetPosition, int targetSpeed, int ptpAcc, int ptpDec);
} }
``` ```
...@@ -68,73 +48,43 @@ IO 管理器接口,提供对 IO 信号的管理和控制功能。 ...@@ -68,73 +48,43 @@ IO 管理器接口,提供对 IO 信号的管理和控制功能。
public interface I_IOManager public interface I_IOManager
{ {
/// <summary> /// <summary>
/// 初始化IO管理器 /// 连接IO设备列表
/// </summary> /// </summary>
bool Initialize(); bool ConnectionIOList(List<string> dIODeviceNameList);
/// <summary>
/// 关闭IO管理器
/// </summary>
void Close();
/// <summary>
/// 读取输入信号状态
/// </summary>
bool ReadInput(int ioId);
/// <summary>
/// 写入输出信号状态
/// </summary>
bool WriteOutput(int ioId, bool value);
/// <summary> /// <summary>
/// 批量读取输入信号状态 /// 读取所有DI信号
/// </summary> /// </summary>
Dictionary<int, bool> ReadInputs(List<int> ioIds); void ReadAllDI(string deviceName, byte slaveId);
/// <summary> /// <summary>
/// 批量写入输出信号状态 /// 写入单个DO信号
/// </summary> /// </summary>
bool WriteOutputs(Dictionary<int, bool> ioValues); void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value);
/// <summary> /// <summary>
/// 注册IO状态变化事件处理器 /// 获取DI信号值
/// </summary> /// </summary>
void RegisterIOChangeHandler(int ioId, Action<int, bool> handler); IO_VALUE GetDIValue(string deviceName, byte slaveID, ushort v);
} }
``` ```
### 2.3 I_SafetyDevice 接口 ### 2.3 ISafetyDevice 接口
安全设备接口,提供对安全相关设备的管理和监控功能。 安全设备接口,提供对安全相关设备的暂停和恢复功能。
```csharp ```csharp
public interface I_SafetyDevice public interface ISafetyDevice
{ {
/// <summary> /// <summary>
/// 初始化安全设备 /// 暂停设备
/// </summary>
bool Initialize();
/// <summary>
/// 关闭安全设备
/// </summary>
void Close();
/// <summary>
/// 获取安全状态
/// </summary>
SafetyStatus GetSafetyStatus();
/// <summary>
/// 重置安全状态
/// </summary> /// </summary>
bool ResetSafetyStatus(); void Pause();
/// <summary> /// <summary>
/// 注册安全状态变化事件处理器 /// 恢复设备
/// </summary> /// </summary>
void RegisterSafetyStatusChangeHandler(Action<SafetyStatus> handler); void Resume();
} }
``` ```
...@@ -146,39 +96,52 @@ public interface I_SafetyDevice ...@@ -146,39 +96,52 @@ public interface I_SafetyDevice
public interface IRobot public interface IRobot
{ {
/// <summary> /// <summary>
/// 初始化机器人 /// 机器人配置
/// </summary> /// </summary>
bool Initialize(); Robot_Config Config { get; set; }
/// <summary> /// <summary>
/// 关闭机器人 /// 机器人名称
/// </summary> /// </summary>
void Close(); string Name { get; set; }
/// <summary> /// <summary>
/// 获取机器人当前位置 /// 是否可以运行
/// </summary> /// </summary>
RobotPosition GetCurrentPosition(); bool canRunning { get; set; }
/// <summary> /// <summary>
/// 移动机器人到指定位置 /// 是否忙碌
/// </summary> /// </summary>
bool MoveToPosition(RobotPosition position, double speed); bool isBusy { get; set; }
/// <summary> /// <summary>
/// 执行机器人程序 /// 是否报警
/// </summary> /// </summary>
bool ExecuteProgram(string programName, Dictionary<string, object> parameters = null); bool isAlarm { get; set; }
/// <summary> /// <summary>
/// 停止机器人运动 /// 运行状态
/// </summary> /// </summary>
bool StopMotion(); RunStatus runStatus { get; set; }
/// <summary> /// <summary>
/// 获取机器人状态 /// 运行
/// </summary> /// </summary>
RobotStatus GetRobotStatus(); void Run();
}
```
### 2.5 RunStatus 枚举
机器人运行状态枚举。
```csharp
public enum RunStatus
{
Stop,
Running,
HomeReset
} }
``` ```
...@@ -208,63 +171,53 @@ public class IOManager : I_IOManager ...@@ -208,63 +171,53 @@ public class IOManager : I_IOManager
} }
``` ```
### 3.3 Camera 类 ### 3.3 HIKCamera 类
相机设备的抽象和控制实现。 海康相机设备的封装实现。
```csharp ```csharp
public class Camera public class HIKCamera
{ {
/// <summary> /// <summary>
/// 初始化相机 /// 相机名称
/// </summary>
public bool Initialize(string cameraConfigPath);
/// <summary>
/// 关闭相机
/// </summary> /// </summary>
public void Close(); public string Name;
/// <summary> /// <summary>
/// 开始采集图像 /// 设备名称
/// </summary> /// </summary>
public bool StartAcquisition(); public string DeviceName;
/// <summary> /// <summary>
/// 停止采集图像 /// 图像显示控件
/// </summary> /// </summary>
public void StopAcquisition(); public PictureBox picture;
/// <summary> /// <summary>
/// 采集单张图像 /// 相机事件,当采集到图像时触发
/// </summary> /// </summary>
public Bitmap CaptureImage(); public event EventHandler<Bitmap> camera_event;
/// <summary>
/// 设置相机参数
/// </summary>
public bool SetParameter(string paramName, object value);
/// <summary>
/// 获取相机参数
/// </summary>
public object GetParameter(string paramName);
} }
``` ```
### 3.4 C8WeightSensor 类 ### 3.4 OKLE_WeightSensor 类
C8系列重量传感器的实现 OKLE系列重量传感器的实现,用于轴负载检测
```csharp ```csharp
public class C8WeightSensor public class OKLE_WeightSensor
{ {
/// <summary> /// <summary>
/// 初始化传感器 /// 初始化传感器
/// </summary> /// </summary>
public bool Initialize(string portName, int baudRate); public bool Init();
/// <summary> /// <summary>
/// 端口是否打开
/// </summary>
public bool IsPortOpen { get; }
/// <summary>
/// 关闭传感器 /// 关闭传感器
/// </summary> /// </summary>
public void Close(); public void Close();
...@@ -275,19 +228,14 @@ public class C8WeightSensor ...@@ -275,19 +228,14 @@ public class C8WeightSensor
public double GetWeight(); public double GetWeight();
/// <summary> /// <summary>
/// 零点校准 /// 获取峰值重量
/// </summary> /// </summary>
public bool ZeroCalibration(); public double PeakWeight();
/// <summary> /// <summary>
/// 量程校准 /// 设置报警阈值
/// </summary> /// </summary>
public bool SpanCalibration(double calibrationWeight); public bool SetAlarmWeight(double kg);
/// <summary>
/// 设置采样频率
/// </summary>
public bool SetSamplingRate(int rate);
} }
``` ```
...@@ -295,35 +243,32 @@ public class C8WeightSensor ...@@ -295,35 +243,32 @@ public class C8WeightSensor
### 4.1 ServerCommunication 类 ### 4.1 ServerCommunication 类
与服务器通信的模块,实现数据上传和命令接收功能。 与服务器通信的模块,实现数据上传和状态同步功能。
```csharp ```csharp
public class ServerCommunication public class ServerCommunication
{ {
/// <summary> /// <summary>
/// 初始化通信连接 /// 开启服务器连接定时器
/// </summary> /// </summary>
public bool Initialize(string serverAddress, int port); public void StartConnectServer();
/// <summary> /// <summary>
/// 关闭通信连接 /// 停止服务器连接
/// </summary> /// </summary>
public void Close(); public void StopConnectServer();
/// <summary> /// <summary>
/// 发送数据到服务器 /// 发送库位状态
/// </summary> /// </summary>
public bool SendData(string data); /// <param name="posid">库位ID</param>
/// <param name="storeStatus">库位状态</param>
public bool SendStoreState(string posid, StoreStatus storeStatus);
/// <summary> /// <summary>
/// 注册命令接收事件处理器 /// 发送流水线状态(心跳)
/// </summary> /// </summary>
public void RegisterCommandReceivedHandler(Action<string> handler); public void SendLineStatus();
/// <summary>
/// 检查连接状态
/// </summary>
public bool IsConnected();
} }
``` ```
...@@ -331,49 +276,54 @@ public class ServerCommunication ...@@ -331,49 +276,54 @@ public class ServerCommunication
### 5.1 CodeManager 类 ### 5.1 CodeManager 类
条码管理工具类,提供条码生成和解析功能 条码和相机管理工具类
```csharp ```csharp
public class CodeManager public class CodeManager
{ {
/// <summary> /// <summary>
/// 生成条码 /// 加载配置
/// </summary>
public static void LoadConfig();
/// <summary>
/// 加载相机
/// </summary> /// </summary>
public string GenerateCode(string prefix, int sequenceNumber); public static void LoadCamera(bool isReLoad);
/// <summary> /// <summary>
/// 验证条码格式 /// 扫描条码
/// </summary> /// </summary>
public bool ValidateCode(string code); public static List<CodeInfo> CameraScan(List<string> cameraNameList);
/// <summary> /// <summary>
/// 解析条码信息 /// 关闭指定相机
/// </summary> /// </summary>
public CodeInfo ParseCode(string code); public static void CloseCamera(string cameraName);
} }
``` ```
### 5.2 ConfigManager 类 ### 5.2 ConfigHelper 类
配置管理工具类,提供配置文件的读取和保存功能。 配置管理工具类,提供配置文件的读取和保存功能。
```csharp ```csharp
public class ConfigManager public class ConfigHelper.Config
{ {
/// <summary> /// <summary>
/// 从文件加载配置 /// 读取配置
/// </summary> /// </summary>
public static T LoadConfig<T>(string configPath) where T : class, new(); public static T Get<T>(string key, T defaultVal = default(T));
/// <summary> /// <summary>
/// 保存配置到文件 /// 设置配置
/// </summary> /// </summary>
public static bool SaveConfig<T>(string configPath, T config) where T : class; public static void Set<T>(string key, T value);
/// <summary> /// <summary>
/// 获取默认配置路径 /// 重载配置
/// </summary> /// </summary>
public static string GetDefaultConfigPath(string configName); public static void ReloadConfig();
} }
``` ```
...@@ -393,66 +343,37 @@ DeviceLibrary 定义了一系列自定义异常类,用于表示不同类型的 ...@@ -393,66 +343,37 @@ DeviceLibrary 定义了一系列自定义异常类,用于表示不同类型的
### 7.1 轴控制示例 ### 7.1 轴控制示例
```csharp ```csharp
// 创建并初始化轴管理器 // 假设已通过 Config 配置好轴参数
IAxisManager axisManager = new AxisManager(); AxisBean axis = new AxisBean(axisConfig, "Robot1");
if (axisManager.Initialize())
// 绝对运动到位置 1000
MoveInfo moveInfo = new MoveInfo("TestMove");
axis.AbsMove(moveInfo, 1000, 50); // 目标位置1000,速度50%
// 回零
axis.HomeMove(moveInfo);
// 检查是否在位
if (axis.IsOnSite(1000))
{ {
try Console.WriteLine("Axis reached target.");
{
// 使轴1以10mm/s的速度正向点动
axisManager.MoveAxisJog(1, 10.0, true);
// 延时2秒后停止轴1
Thread.Sleep(2000);
axisManager.StopAxis(1);
// 获取轴1的当前位置
AxisBean axis = axisManager.GetAxisById(1);
Console.WriteLine($"Axis 1 current position: {axis.CurrentPosition}");
}
catch (DeviceException ex)
{
Console.WriteLine($"Device error: {ex.Message}");
}
finally
{
// 关闭轴管理器
axisManager.Close();
}
} }
``` ```
### 7.2 IO控制示例 ### 7.2 IO控制示例
```csharp ```csharp
// 创建并初始化IO管理器 // 读取DI信号
I_IOManager ioManager = new IOManager(); // 假设 deviceName="" (本地板卡), slaveId=0, index=10
if (ioManager.Initialize()) IO_VALUE val = IOManager.GetDIValue("", 0, 10);
if (val == IO_VALUE.HIGH)
{ {
try Console.WriteLine("Input 10 is HIGH");
{
// 读取输入点10的状态
bool inputState = ioManager.ReadInput(10);
Console.WriteLine($"Input 10 state: {inputState}");
// 写入输出点5为true
ioManager.WriteOutput(5, true);
// 注册IO变化事件处理器
ioManager.RegisterIOChangeHandler(10, (ioId, value) => {
Console.WriteLine($"IO {ioId} changed to: {value}");
});
}
catch (DeviceException ex)
{
Console.WriteLine($"Device error: {ex.Message}");
}
finally
{
// 关闭IO管理器
ioManager.Close();
}
} }
// 写入DO信号
// 假设 index=5
IOManager.SetDOValue("", 0, 5, IO_VALUE.HIGH);
``` ```
## 8. 总结 ## 8. 总结
......
# IO控制 API 文档 # IO控制 API 文档
## 1. 概述 ## 文档信息
本文档详细介绍了 SISO 系统中 IO 控制相关的 API 接口,包括 IO 管理器接口、IO 信号读写方法、状态监控以及相关数据结构。这些 API 提供了对系统输入输出信号的统一管理和控制功能。 | 项目 | 内容 |
|------|------|
| 版本 | 1.1.0 |
| 状态 | 正式版 |
| 编写日期 | 2025-12-18 |
| 最后更新 | 2025-12-18 |
| 编写人 | MIMO 开发团队 |
## 2. IO管理器接口 ## 更新日志
### 2.1 I_IOManager 接口 | 版本 | 日期 | 更新内容 | 编写人 |
|------|------|----------|--------|
| 1.1.0 | 2025-12-18 | 根据实际代码更新接口定义 | MIMO 开发团队 |
| 1.0.0 | 2025-12-16 | 初始版本 | MIMO 开发团队 |
`I_IOManager` 是 IO 控制模块的核心接口,定义了对 IO 信号进行管理和操作的基本方法。 ## 1. 概述
```csharp 本文档详细介绍了 MIMO 系统中 IO 控制相关的 API 接口,包括 IO 管理器接口 `I_IOManager`。这些 API 提供了对系统输入输出信号的统一管理和控制功能。
public interface I_IOManager
{
#region 初始化与关闭
/// <summary>
/// 初始化IO管理器
/// </summary>
/// <returns>初始化是否成功</returns>
bool Initialize();
/// <summary>
/// 使用指定配置初始化IO管理器
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <returns>初始化是否成功</returns>
bool Initialize(string configPath);
/// <summary>
/// 关闭IO管理器,释放资源
/// </summary>
void Close();
#endregion
#region 单个IO操作
/// <summary>
/// 读取输入信号状态
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <returns>IO点状态,true表示信号有效,false表示信号无效</returns>
bool ReadInput(int ioId);
/// <summary>
/// 写入输出信号状态
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <param name="value">要写入的状态值,true表示信号有效,false表示信号无效</param>
/// <returns>写入是否成功</returns>
bool WriteOutput(int ioId, bool value);
/// <summary>
/// 切换输出信号状态
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <returns>切换是否成功</returns>
bool ToggleOutput(int ioId);
#endregion
#region 批量IO操作
/// <summary>
/// 批量读取输入信号状态
/// </summary>
/// <param name="ioIds">要读取的IO点ID列表</param>
/// <returns>IO点ID与状态值的映射字典</returns>
Dictionary<int, bool> ReadInputs(List<int> ioIds);
/// <summary>
/// 批量写入输出信号状态
/// </summary>
/// <param name="ioValues">IO点ID与要写入状态值的映射字典</param>
/// <returns>写入是否全部成功</returns>
bool WriteOutputs(Dictionary<int, bool> ioValues);
/// <summary>
/// 读取所有输入信号状态
/// </summary>
/// <returns>所有输入IO点ID与状态值的映射字典</returns>
Dictionary<int, bool> ReadAllInputs();
/// <summary>
/// 读取所有输出信号状态
/// </summary>
/// <returns>所有输出IO点ID与状态值的映射字典</returns>
Dictionary<int, bool> ReadAllOutputs();
#endregion
#region IO信息获取
/// <summary>
/// 获取所有IO点信息
/// </summary>
/// <returns>IO点信息列表</returns>
List<IOInfo> GetAllIOs();
/// <summary>
/// 根据IO点ID获取IO点信息
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <returns>IO点信息对象,如果未找到返回null</returns>
IOInfo GetIOInfo(int ioId);
/// <summary>
/// 根据IO点名获取IO点信息
/// </summary>
/// <param name="ioName">IO点名</param>
/// <returns>IO点信息对象,如果未找到返回null</returns>
IOInfo GetIOInfoByName(string ioName);
#endregion
#region IO映射
/// <summary>
/// 根据IO点名获取IO点ID
/// </summary>
/// <param name="ioName">IO点名</param>
/// <returns>IO点ID,如果未找到返回-1</returns>
int GetIOIdByName(string ioName);
/// <summary>
/// 根据IO点ID获取IO点名
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <returns>IO点名,如果未找到返回空字符串</returns>
string GetIONameById(int ioId);
#endregion
#region 事件处理
/// <summary>
/// 注册IO状态变化事件处理器
/// </summary>
/// <param name="ioId">IO点ID,传入-1表示监听所有IO点变化</param>
/// <param name="handler">事件处理函数,参数为IO点ID和新状态值</param>
void RegisterIOChangeHandler(int ioId, Action<int, bool> handler);
/// <summary>
/// 注销IO状态变化事件处理器
/// </summary>
/// <param name="ioId">IO点ID,传入-1表示注销所有IO点的处理器</param>
/// <param name="handler">事件处理函数,如果为null则注销该IO点的所有处理器</param>
void UnregisterIOChangeHandler(int ioId, Action<int, bool> handler = null);
#endregion
#region 高级功能
/// <summary>
/// 设置输出点闪烁
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <param name="onTimeMs">亮的时间(毫秒)</param>
/// <param name="offTimeMs">灭的时间(毫秒)</param>
/// <param name="repeatCount">闪烁次数,0表示无限循环</param>
/// <returns>设置是否成功</returns>
bool BlinkOutput(int ioId, int onTimeMs, int offTimeMs, int repeatCount = 0);
/// <summary>
/// 停止输出点闪烁
/// </summary>
/// <param name="ioId">IO点ID,传入-1表示停止所有闪烁的输出点</param>
/// <returns>停止是否成功</returns>
bool StopBlinkOutput(int ioId = -1);
/// <summary>
/// 延时输出
/// </summary>
/// <param name="ioId">IO点ID</param>
/// <param name="value">要写入的状态值</param>
/// <param name="delayMs">延时时间(毫秒)</param>
/// <returns>设置是否成功</returns>
bool DelayedWriteOutput(int ioId, bool value, int delayMs);
#endregion
}
```
## 3. 数据结构 ## 2. IO管理器接口
### 3.1 IOInfo 类 ### 2.1 I_IOManager 接口
`IOInfo` 类用于表示 IO 点的属性和配置信息 `I_IOManager` 是 IO 控制模块的核心接口,定义了对 IO 信号进行管理和操作的基本方法
```csharp ```csharp
public class IOInfo namespace DeviceLibrary
{ {
/// <summary> public interface I_IOManager
/// IO点ID {
/// </summary> /// <summary>
public int Id { get; set; } /// 连接IO设备列表
/// </summary>
/// <summary> bool ConnectionIOList(List<string> dIODeviceNameList);
/// IO点名
/// </summary> /// <summary>
public string Name { get; set; } /// 读取所有DI信号
/// </summary>
/// <summary> void ReadAllDI(string deviceName, byte slaveId);
/// IO点类型(输入/输出)
/// </summary> /// <summary>
public IOType Type { get; set; } /// 读取所有DO信号
/// </summary>
/// <summary> void ReadAllDO(string deviceName, byte slaveId);
/// IO点描述
/// </summary> /// <summary>
public string Description { get; set; } /// 写入单个DO信号 (带延时)
/// </summary>
/// <summary> void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value, int time);
/// 物理地址
/// </summary> /// <summary>
public string PhysicalAddress { get; set; } /// 写入单个DO信号
/// </summary>
/// <summary> void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value);
/// 是否反转(取反)
/// </summary> /// <summary>
public bool IsInverted { get; set; } /// 获取DI信号值
/// </summary>
/// <summary> IO_VALUE GetDIValue(string deviceName, byte slaveID, ushort v);
/// 默认值
/// </summary> /// <summary>
public bool DefaultValue { get; set; } /// 获取DO信号值
/// </summary>
/// <summary> IO_VALUE GetDOValue(string deviceName, byte slaveID, ushort v);
/// 是否是安全相关IO
/// </summary> /// <summary>
public bool IsSafetyRelated { get; set; } /// 根据配置对象获取IO值
/// </summary>
/// <summary> IO_VALUE GetIOValue(ConfigIO configIO);
/// 当前值(仅用于信息展示,不保证实时性)
/// </summary> /// <summary>
public bool CurrentValue { get; set; } /// 关闭所有DO
/// </summary>
void CloseAllDO();
/// <summary>
/// 关闭所有连接
/// </summary>
void CloseAllConnection();
}
} }
``` ```
### 3.2 枚举类型 ### 2.2 数据类型
#### 3.2.1 IOType 枚举
表示 IO 点类型。 #### IO_VALUE 枚举
```csharp ```csharp
public enum IOType public enum IO_VALUE
{ {
/// <summary> LOW = 0,
/// 输入点 HIGH = 1,
/// </summary> None = 2
Input = 0,
/// <summary>
/// 输出点
/// </summary>
Output = 1,
/// <summary>
/// 模拟输入
/// </summary>
AnalogInput = 2,
/// <summary>
/// 模拟输出
/// </summary>
AnalogOutput = 3
} }
``` ```
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## 1. 概述 ## 1. 概述
本文档详细描述了SISO系统中的Layer5(边缘计算层)和Layer6(设备控制层)的架构设计、组件关系和实现方式。这两层是系统与物理设备交互的核心,负责设备控制、数据采集和边缘计算处理。 本文档详细描述了MIMO系统中的Layer5(边缘计算层)和Layer6(设备控制层)的架构设计、组件关系和实现方式。这两层是系统与物理设备交互的核心,负责设备控制、数据采集和边缘计算处理。
## 2. Layer6 (设备控制层) ## 2. Layer6 (设备控制层)
...@@ -20,19 +20,13 @@ ...@@ -20,19 +20,13 @@
#### 目录结构 #### 目录结构
``` ```
DeviceLibrary/ Core/
├── Interfaces/ # 设备抽象接口 ├── Devices/ # 设备控制层 (DeviceLibrary)
│ ├── IAxisManager.cs # 轴管理器接口 │ ├── Axis/ # 轴控制相关 (IAxisManager, AxisManager)
│ ├── I_IOManager.cs # IO管理器接口 │ ├── IO/ # IO控制相关 (I_IOManager, IOManager)
│ ├── I_SafetyDevice.cs # 安全设备接口 │ ├── Sensors/ # 传感器实现 (WeightSensor, Camera)
│ └── IRobot.cs # 机器人接口 │ ├── Controllers/ # 控制器封装 (AxisBean)
├── Implementations/ # 具体实现 │ └── Common/ # 通用设备定义
│ ├── Axis/ # 轴控制相关实现
│ ├── IO/ # IO控制相关实现
│ ├── Sensors/ # 传感器实现
│ └── Actuators/ # 执行器实现
├── Helpers/ # 辅助工具类
└── Configs/ # 设备配置文件
``` ```
### 2.2 主要模块说明 ### 2.2 主要模块说明
...@@ -84,20 +78,20 @@ DeviceLibrary/ ...@@ -84,20 +78,20 @@ DeviceLibrary/
#### 目录结构 #### 目录结构
``` ```
TheMachine/ Core/
├── Core/ # 核心业务逻辑 ├── MachineControl/ # 机器控制核心
│ ├── MainMachine.cs # 主机器控制逻辑 │ ├── MainMachine.cs # 主机器控制逻辑 (Partial Class)
│ ├── RobotManage.cs # 机器人管理逻辑 │ ├── RobotManage.cs # 机器人/全局配置管理 (Singleton)
│ └── BoxTransport.cs # 料箱传输控制逻辑 │ └── Components/ # MainMachine的分部类实现
├── Controllers/ # 控制器 │ ├── MainMachine_String.cs # 料串进出逻辑
├── AxisControl.cs # 轴控制界面控制器 ├── MainMachine_Clamp.cs # 取放料逻辑
├── IOControls.cs # IO控制界面控制器 ├── MainMachine_Store.cs # 库位管理逻辑
└── SettingControl.cs # 设置界面控制器 └── ...
├── Services/ # 服务层 ├── BusinessLogic/ # 业务逻辑
│ ├── JobManagement/ # 任务管理服务 │ ├── BoxTransport.cs # ReelTransport 类定义 (料盘搬运核心逻辑)
│ ├── StateManagement/ # 状态管理服务 │ ├── MoveInfo.cs # 运动步骤状态封装 (MoveStep Enum)
│ └── EventProcessing/ # 事件处理服务 │ └── JobList.cs # 任务队列逻辑
└── Utils/ # 工具类 └── DataProcessing/ # 数据处理
``` ```
### 3.2 主要功能模块 ### 3.2 主要功能模块
...@@ -194,4 +188,4 @@ Layer5和Layer6之间采用以下通信机制: ...@@ -194,4 +188,4 @@ Layer5和Layer6之间采用以下通信机制:
## 8. 总结 ## 8. 总结
Layer5和Layer6作为SISO系统的核心组成部分,通过清晰的分层设计和接口定义,实现了设备控制和边缘计算功能的有效分离和协作。这种设计使得系统具有良好的可维护性、可扩展性和可靠性,能够满足工业自动化场景的需求。
\ No newline at end of file \ No newline at end of file
Layer5和Layer6作为MIMO系统的核心组成部分,通过清晰的分层设计和接口定义,实现了设备控制和边缘计算功能的有效分离和协作。这种设计使得系统具有良好的可维护性、可扩展性和可靠性,能够满足工业自动化场景的需求。
\ No newline at end of file \ No newline at end of file
# SISO系统架构概述 # MIMO系统架构概述
## 1. 系统简介 ## 1. 系统简介
SISO(Single Input Single Output)系统是一个工业自动化控制平台,用于管理和控制各类工业设备,包括运动轴、传感器、执行器等。系统采用分层架构设计,实现了设备控制、数据处理、业务逻辑和用户交互的有效分离。 MIMO(SMD BOX MIMO G2)系统是一个先进的工业自动化控制平台,用于管理和控制各类工业设备,包括运动轴、传感器、执行器等。系统采用分层架构设计,实现了设备控制、数据处理、业务逻辑和用户交互的有效分离。
## 2. 整体架构 ## 2. 整体架构
### 2.1 分层架构 ### 2.1 分层架构
SISO系统采用经典的分层架构设计,从上到下依次分为以下几层: MIMO系统采用经典的分层架构设计,从上到下依次分为以下几层:
1. **表现层(Layer 1-2)**:用户界面和交互组件 1. **表现层(Layer 1-2)**:用户界面和交互组件 (`UI` 目录)
2. **应用层(Layer 3-4)**:业务应用和功能模块 2. **应用层(Layer 3-4)**:业务应用和功能模块
3. **边缘计算层(Layer 5)**:数据处理和业务逻辑 3. **边缘计算层(Layer 5)**:数据处理和业务逻辑 (`Core/MachineControl`)
4. **设备控制层(Layer 6)**:设备抽象和控制接口 4. **设备控制层(Layer 6)**:设备抽象和控制接口 (`Core/Devices`)
5. **设备层(Layer 7)**:物理设备和硬件接口 5. **设备层(Layer 7)**:物理设备和硬件接口
本文档主要关注系统的Layer5和Layer6部分。 本文档主要关注系统的Layer5和Layer6部分。
...@@ -24,35 +24,31 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几 ...@@ -24,35 +24,31 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几
``` ```
┌─────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────┐
│ 表现层 (Layer 1-2) │ 表现层 (UI)
│ ┌───────────────┐ ┌───────────────┐ │ │ ┌───────────────┐ ┌───────────────┐ │
│ │ 主界面 │ │ 配置界面 │ │ │ │ MainForm │ │ Controls │ │
│ └───────┬───────┘ └───────┬───────┘ │ │ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │ │ │ │ │
└──────────┼──────────────────┼───────────────────┘ └──────────┼──────────────────┼───────────────────┘
│ │ │ │
┌──────────┼──────────────────┼───────────────────┐ ┌──────────┼──────────────────┼───────────────────┐
│ │ │ │ │ │ │ │
│ ┌───────▼───────┐ ┌───────▼───────┐ │ │ └──────────┬───────┘ │
│ │ 应用服务 │ │ 业务模块 │ │ │ │ │
│ └───────┬───────┘ └───────┬───────┘ │ │ 边缘计算层 (Core/MachineControl, BusinessLogic) │
│ │ │ │ │ ┌─────────────────▼─────────────────┐ │
│ └──────────┬───────┘ │ │ │ MainMachine (主控) │ │
│ │ │ │ ├─────────────────┬─────────────────┤ │
│ 边缘计算层 (Layer 5) │ │ │ RobotManage │ ReelTransport │ │
│ ┌─────────────────▼─────────────────┐ │ │ └─────────────────┴─────────────────┘ │
│ │ MainMachine (主控) │ │ │ │ │
│ ├─────────────────┬─────────────────┤ │ │ ┌──────────┴──────────┐ │
│ │ RobotManage │ BoxTransport │ │ │ │ │ │
│ └─────────────────┴─────────────────┘ │ └──────────┼─────────────────────┼────────────────┘
│ │ │
│ ┌──────────┴──────────┐ │
│ │ │ │
└──────────┼─────────────────────┼───────────────┘
│ │ │ │
┌──────────▼─────────┐ ┌─────────▼─────────┐ ┌──────────▼─────────┐ ┌─────────▼─────────┐
│ 设备控制层 │ │ 设备控制层 │ │ 设备控制层 │ │ 设备控制层 │
│ (Layer 6 - 轴控) │ │ (Layer 6 - IO) │ (Devices/Axis) │ │ (Devices/IO)
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ AxisManager │ │ │ │ IOManager │ │ │ │ AxisManager │ │ │ │ IOManager │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
...@@ -66,23 +62,25 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几 ...@@ -66,23 +62,25 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几
## 3. 主要功能模块 ## 3. 主要功能模块
### 3.1 设备控制层 (Layer 6) ### 3.1 设备控制层 (Core/Devices)
设备控制层负责提供统一的设备抽象和控制接口,主要包括: 设备控制层负责提供统一的设备抽象和控制接口,主要包括:
- **轴控制**:管理运动轴的状态和运动 - **Axis**`IAxisManager` 及其实现,管理运动轴。
- **IO控制**:管理输入输出信号 - **IO**`I_IOManager` 及其实现,管理 IO 信号。
- **传感器管理**:处理各类传感器数据 - **Controllers**:具体硬件控制器的实现(如 `HC`, `dauxiKS107`)。
- **执行器控制**:控制各类执行器动作 - **Camera**:相机设备控制。
### 3.2 边缘计算层 (Layer 5) ### 3.2 边缘计算层 (Core/MachineControl)
边缘计算层负责处理设备数据、实现业务逻辑和协调设备交互,主要包括: 边缘计算层负责处理设备数据、实现业务逻辑和协调设备交互,主要包括:
- **机器控制**:协调各设备完成整体任务流程 - **MainMachine**:系统主控逻辑入口,作为部分类(Partial Class)实现,集成了多个子功能模块。
- **任务管理**:管理和调度各类任务 - **状态机管理**:通过 `MoveInfo` 对象管理多个并行的业务流程(如 `StringMoveInfo`, `ClampMoveInfo`, `StoreMoveInfo`)。
- **状态监控**:监控系统和设备状态 - **流程协调**:协调料串机构、取放料机构和库位调度之间的交互。
- **数据处理**:对采集的数据进行处理和分析 - **RobotManage**:单例管理器,持有 `MainMachine` 实例和全局配置,负责系统级别的状态管理。
- **ReelTransport**:专注于料盘在库位、校准位和IO口之间的搬运逻辑(实现于 `BoxTransport.cs`)。
- **Components**:各类机器组件的具体逻辑实现(如 `MainMachine_Store`, `MainMachine_Clamp`)。
## 4. 技术架构 ## 4. 技术架构
...@@ -130,4 +128,4 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几 ...@@ -130,4 +128,4 @@ SISO系统采用经典的分层架构设计,从上到下依次分为以下几
## 7. 总结 ## 7. 总结
SISO系统采用分层架构设计,实现了设备控制和业务逻辑的有效分离,具有良好的可维护性、可扩展性和可靠性。系统的Layer5和Layer6部分作为连接应用层和物理设备的桥梁,在系统中扮演着至关重要的角色。
\ No newline at end of file \ No newline at end of file
MIMO系统采用分层架构设计,实现了设备控制和业务逻辑的有效分离,具有良好的可维护性、可扩展性和可靠性。系统的Layer5和Layer6部分作为连接应用层和物理设备的桥梁,在系统中扮演着至关重要的角色。
\ No newline at end of file \ No newline at end of file
# 轴配置说明 # 轴与IO配置说明
## 1. 概述 ## 1. 概述
本文档详细说明SISO系统中运动轴的配置方法,包括配置文件格式、参数说明以及配置示例。轴配置对于系统的运动控制精度和稳定性至关重要,用户应根据实际设备情况正确配置相关参数 本文档详细说明MIMO系统中运动轴及IO信号的配置方法。本系统采用 CSV 格式进行轴、IO信号和通用属性的配置,配置文件位于 `Core/Config/Config.csv`
## 2. 配置文件格式 ## 2. 配置文件格式
轴配置可以通过配置文件或系统界面进行设置。配置文件通常采用XML或JSON格式,存储在系统配置目录中。 配置文件采用 CSV (Comma-Separated Values) 格式。每一行代表一个配置项。
### 2.1 基本配置结构 ### 2.1 轴配置 (AXIS)
```xml `AXIS` 开头的行定义了轴的配置。
<?xml version="1.0" encoding="utf-8" ?>
<AxesConfig> **字段顺序与说明:**
<Axes>
<Axis> | 索引 | 字段名 | 说明 | 示例 |
<Id>1</Id> |---|---|---|---|
<Name>X-Axis</Name> | 0 | Type | 配置类型,固定为 `AXIS` | AXIS |
<Type>Linear</Type> | 1 | Group | 分组(通常为空) | |
<MotorType>Servo</MotorType> | 2 | Description | 中文描述 | 旋转轴 |
<ControllerId>1</ControllerId> | 3 | Name | 轴的程序内部名称 | Middle_Axis |
<AxisNumber>0</AxisNumber> | 4 | AxisID | 轴号/ID | 0 |
<Enable>true</Enable> | 5 | DeviceType | 设备类型 | HC |
| 6 | Reserved | 保留 | |
<!-- 机械参数 --> | 7 | TargetSpeed | 目标速度/最大速度 | 60000 |
<Mechanical> | 8 | Reserved | 保留 | 0 |
<TravelRange>1000.0</TravelRange> | 9 | Reserved | 保留 | 0 |
<Unit>mm</Unit> | 10 | Reserved | 保留 | 0 |
<GearRatio>1.0</GearRatio> | 11 | HomeHighSpeed | 回零高速 | 10000 |
<LeadScrewPitch>5.0</LeadScrewPitch> | 12 | HomeLowSpeed | 回零低速 | 0 |
<PulleyRatio>1.0</PulleyRatio> | 13 | HomeAddSpeed | 回零加速度 | 10 |
</Mechanical> | 14 | Reserved | 保留 | 700 |
| 15 | Reserved | 保留 | 0 |
<!-- 编码器参数 --> | 16 | Reserved | 保留 | 0 |
<Encoder>
<CountsPerRevolution>131072</CountsPerRevolution> **示例:**
<CountsPerUnit>26214.4</CountsPerUnit> ```csv
<Direction>Positive</Direction> AXIS,,旋转轴,Middle_Axis,0,HC,,60000,0,0,0,10000,0,10,700,0,0
</Encoder>
<!-- 运动参数 -->
<Motion>
<MaxSpeed>500.0</MaxSpeed>
<MaxAcceleration>1000.0</MaxAcceleration>
<MaxDeceleration>1000.0</MaxDeceleration>
<Jerk>10000.0</Jerk>
<HomeSpeed>50.0</HomeSpeed>
<JogSpeed>30.0</JogSpeed>
<CreepSpeed>10.0</CreepSpeed>
</Motion>
<!-- 限位配置 -->
<Limits>
<PositiveLimit>1000.0</PositiveLimit>
<NegativeLimit>0.0</NegativeLimit>
<SoftLimitEnable>true</SoftLimitEnable>
<HardLimitEnable>true</HardLimitEnable>
</Limits>
<!-- 回零配置 -->
<Homing>
<HomeMode>ActiveLimitHome</HomeMode>
<HomeDirection>Negative</HomeDirection>
<HomeOffset>10.0</HomeOffset>
<HomeSensorId>101</HomeSensorId>
</Homing>
<!-- IO映射 -->
<IOMapping>
<PositiveLimitSensor>1</PositiveLimitSensor>
<NegativeLimitSensor>2</NegativeLimitSensor>
<HomeSensor>3</HomeSensor>
<ServoEnable>11</ServoEnable>
<ServoAlarm>12</ServoAlarm>
</IOMapping>
</Axis>
<!-- 更多轴配置... -->
</Axes>
</AxesConfig>
``` ```
## 3. 配置参数说明 ### 2.2 IO配置 (DI/DO)
### 3.1 基本参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| Id | Integer | 轴的唯一标识ID | 是 |
| Name | String | 轴的名称(如X轴、Y轴等) | 是 |
| Type | String | 轴类型(Linear-直线轴、Rotary-旋转轴) | 是 |
| MotorType | String | 电机类型(Servo-伺服电机、Stepper-步进电机) | 是 |
| ControllerId | Integer | 控制器ID | 是 |
| AxisNumber | Integer | 在控制器中的轴号 | 是 |
| Enable | Boolean | 是否启用该轴 | 是 |
### 3.2 机械参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| TravelRange | Double | 轴的行程范围 | 是 |
| Unit | String | 单位(mm、deg等) | 是 |
| GearRatio | Double | 齿轮传动比 | 否 |
| LeadScrewPitch | Double | 丝杠导程(对于直线轴) | 否 |
| PulleyRatio | Double | 皮带轮传动比 | 否 |
### 3.3 编码器参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| CountsPerRevolution | Integer | 编码器每转脉冲数 | 是 |
| CountsPerUnit | Double | 每单位移动对应的脉冲数 | 是 |
| Direction | String | 运动方向(Positive-正向、Negative-反向) | 是 |
### 3.4 运动参数
| 参数 | 类型 | 说明 | 是否必需 | `DI``DO` 开头的行定义了输入/输出信号的配置。
|-----|------|-----|--------|
| MaxSpeed | Double | 最大运动速度 | 是 |
| MaxAcceleration | Double | 最大加速度 | 是 |
| MaxDeceleration | Double | 最大减速度 | 是 |
| Jerk | Double | 加加速度 | 否 |
| HomeSpeed | Double | 回零速度 | 是 |
| JogSpeed | Double | 点动速度 | 是 |
| CreepSpeed | Double | 爬行速度(用于精确定位) | 否 |
### 3.5 限位配置 **字段顺序与说明:**
| 参数 | 类型 | 说明 | 是否必需 | | 索引 | 字段名 | 说明 | 示例 |
|-----|------|-----|--------| |---|---|---|---|
| PositiveLimit | Double | 正向软限位值 | 否 | | 0 | Type | 配置类型 (`DI``DO`) | DI |
| NegativeLimit | Double | 负向软限位值 | 否 | | 1 | Group | 分组 | 0 |
| SoftLimitEnable | Boolean | 是否启用软限位 | 否 | | 2 | Description | 中文描述 | 急停 |
| HardLimitEnable | Boolean | 是否启用硬限位 | 否 | | 3 | Name | 程序内部名称 | SuddenStop_BTN |
| 4 | Index | 索引/ID | 0 |
| 5 | DeviceType | 设备类型 | HC |
| 6 | Address | 硬件地址 | X00 |
### 3.6 回零配置 **示例:**
```csv
| 参数 | 类型 | 说明 | 是否必需 | DI,0,急停,SuddenStop_BTN,0,HC,X00,,,,,,,,,,
|-----|------|-----|--------| DO,0,自动指示灯,Run_Led,0,HC,Y00,,,,,,,,,,
| HomeMode | String | 回零模式 | 是 | ```
| HomeDirection | String | 回零方向 | 是 |
| HomeOffset | Double | 回零偏移量 | 否 |
| HomeSensorId | Integer | 回零传感器ID | 否 |
### 3.7 IO映射
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| PositiveLimitSensor | Integer | 正向限位传感器IO点 | 否 |
| NegativeLimitSensor | Integer | 负向限位传感器IO点 | 否 |
| HomeSensor | Integer | 回零传感器IO点 | 否 |
| ServoEnable | Integer | 伺服使能IO点 | 否 |
| ServoAlarm | Integer | 伺服报警IO点 | 否 |
## 4. 回零模式说明 ### 2.3 属性配置 (PRO)
| 回零模式 | 描述 | `PRO` 开头的行定义了通用系统属性,如超时时间、位置参数等。
|--------|------|
| ActiveLimitHome | 主动回零(碰到限位后返回) |
| PassiveHome | 被动回零(等待外部信号触发) |
| SensorHome | 传感器回零(找到原点传感器信号) |
| IndexHome | 编码器索引回零 |
| NoHome | 无需回零 |
## 5. 配置示例 **字段顺序与说明:**
### 5.1 X轴配置示例 | 索引 | 字段名 | 说明 | 示例 |
|---|---|---|---|
| 0 | Type | 配置类型 | PRO |
| 1 | Group | 分组 | 50 |
| 2 | Description | 中文描述 | IO信号超时时间(秒) |
| 3 | Key | 属性键名 | IOSingle_TimerOut |
| 4 | Value | 属性值 | 5 |
```xml **示例:**
<Axis> ```csv
<Id>1</Id> PRO,50,IO信号超时时间(秒),IOSingle_TimerOut,5,,,,,,,,,,,,
<Name>X-Axis</Name>
<Type>Linear</Type>
<MotorType>Servo</MotorType>
<ControllerId>1</ControllerId>
<AxisNumber>0</AxisNumber>
<Enable>true</Enable>
<!-- 机械参数 -->
<Mechanical>
<TravelRange>1000.0</TravelRange>
<Unit>mm</Unit>
<GearRatio>1.0</GearRatio>
<LeadScrewPitch>5.0</LeadScrewPitch>
<PulleyRatio>1.0</PulleyRatio>
</Mechanical>
<!-- 编码器参数 -->
<Encoder>
<CountsPerRevolution>131072</CountsPerRevolution>
<CountsPerUnit>26214.4</CountsPerUnit>
<Direction>Positive</Direction>
</Encoder>
<!-- 运动参数 -->
<Motion>
<MaxSpeed>500.0</MaxSpeed>
<MaxAcceleration>1000.0</MaxAcceleration>
<MaxDeceleration>1000.0</MaxDeceleration>
<Jerk>10000.0</Jerk>
<HomeSpeed>50.0</HomeSpeed>
<JogSpeed>30.0</JogSpeed>
<CreepSpeed>10.0</CreepSpeed>
</Motion>
<!-- 限位配置 -->
<Limits>
<PositiveLimit>1000.0</PositiveLimit>
<NegativeLimit>0.0</NegativeLimit>
<SoftLimitEnable>true</SoftLimitEnable>
<HardLimitEnable>true</HardLimitEnable>
</Limits>
<!-- 回零配置 -->
<Homing>
<HomeMode>ActiveLimitHome</HomeMode>
<HomeDirection>Negative</HomeDirection>
<HomeOffset>10.0</HomeOffset>
<HomeSensorId>101</HomeSensorId>
</Homing>
</Axis>
``` ```
### 5.2 旋转轴配置示例 ## 3. 配置示例
```xml ```csv
<Axis> 类型,分组,说明,名称,值,设备类型,保留,最大速度,起始速度,加速度,减速度,原点高速度,爬行,原点加速度,原点减速度,S曲线平滑,保留
<Id>4</Id> AXIS,,旋转轴,Middle_Axis,0,HC,,60000,0,0,0,10000,0,10,700,0,0
<Name>Theta-Axis</Name> AXIS,,升降轴,UpDown_Axis,1,HC,,20000,0,0,0,40000,0,10,700,0,0
<Type>Rotary</Type> PRO,50,IO信号超时时间(秒),IOSingle_TimerOut,5,,,,,,,,,,,,
<MotorType>Servo</MotorType> DI,0,急停,SuddenStop_BTN,0,HC,X00,,,,,,,,,,
<ControllerId>1</ControllerId> DO,0,自动指示灯,Run_Led,0,HC,Y00,,,,,,,,,,
<AxisNumber>3</AxisNumber>
<Enable>true</Enable>
<!-- 机械参数 -->
<Mechanical>
<TravelRange>360.0</TravelRange>
<Unit>deg</Unit>
<GearRatio>10.0</GearRatio>
<LeadScrewPitch>0.0</LeadScrewPitch>
<PulleyRatio>1.0</PulleyRatio>
</Mechanical>
<!-- 编码器参数 -->
<Encoder>
<CountsPerRevolution>131072</CountsPerRevolution>
<CountsPerUnit>364.09</CountsPerUnit>
<Direction>Positive</Direction>
</Encoder>
<!-- 运动参数 -->
<Motion>
<MaxSpeed>180.0</MaxSpeed>
<MaxAcceleration>360.0</MaxAcceleration>
<MaxDeceleration>360.0</MaxDeceleration>
<Jerk>3600.0</Jerk>
<HomeSpeed>60.0</HomeSpeed>
<JogSpeed>30.0</JogSpeed>
<CreepSpeed>10.0</CreepSpeed>
</Motion>
<!-- 限位配置 -->
<Limits>
<PositiveLimit>360.0</PositiveLimit>
<NegativeLimit>0.0</NegativeLimit>
<SoftLimitEnable>false</SoftLimitEnable>
<HardLimitEnable>false</HardLimitEnable>
</Limits>
<!-- 回零配置 -->
<Homing>
<HomeMode>SensorHome</HomeMode>
<HomeDirection>Positive</HomeDirection>
<HomeOffset>0.0</HomeOffset>
<HomeSensorId>104</HomeSensorId>
</Homing>
</Axis>
``` ```
## 5. 参数调整建议 ## 4. 参数调整建议
### 5.1 运动参数调整
- **速度参数**:根据负载情况和设备刚性调整,避免机械振动
- **加速度/减速度**:过大可能导致机械冲击,过小会影响效率
- **加加速度(Jerk)**:平滑运动过渡,减少振动
- **回零参数**:回零速度不宜过快,确保定位准确性
### 5.2 安全参数
- **限位配置**:确保硬限位和软限位都正确设置,避免机械碰撞
- **方向设置**:确保运动方向正确,避免反方向运动造成危险
- **使能控制**:设置正确的伺服使能信号,确保安全运行
## 6. 常见问题与解决方案 ### 4.1 运动参数调整
### 6.1 运动精度问题 - **TargetSpeed (最大速度)**:根据负载情况和设备刚性调整,避免机械振动。
- **HomeHighSpeed (回零高速)**:回零时的快速移动速度。
- **HomeAddSpeed (回零加速度)**:回零过程中的加速度。
- 检查编码器参数设置是否正确 ### 4.2 IO配置
- 确认机械传动部分是否存在间隙或松动
- 调整速度和加速度参数,减少振动
### 6.2 回零异常 - **Address (硬件地址)**:必须与电气原理图和PLC/板卡实际接线一致。
- **Index (索引)**:程序内部使用的索引,应保持唯一。
- 确认回零传感器安装位置和连接是否正确 ## 5. 常见问题与解决方案
- 检查回零模式设置是否与实际硬件匹配
- 调整回零速度和方向参数
### 6.3 运动不平滑 ### 5.1 轴无法移动
- 增加Jerk参数值,使速度变化更加平滑 - 检查 `Config.csv` 中的 `AxisID``DeviceType` 是否正确。
- 检查机械系统是否有卡滞或摩擦过大的情况 - 确认 `TargetSpeed` 是否设置为非零值。
- 调整PID参数(如果控制器支持)
### 6.4 限位触发 ### 5.2 IO信号无反应
- 确认限位传感器连接和设置是否正确
- 检查软限位参数是否设置合理
- 确认轴的运动范围与实际机械结构匹配
\ No newline at end of file \ No newline at end of file
- 检查 `Address` 是否与硬件接线对应。
- 确认 `DeviceType` 是否匹配实际使用的IO卡或控制器。
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## 1. 概述 ## 1. 概述
本文档详细说明SISO系统中相机设备的配置方法,包括配置文件格式、参数说明以及配置示例。相机配置文件采用JSON格式,存储在`DeviceLibrary/Config/`目录下。 本文档详细说明MIMO系统中相机设备的配置方法,包括配置文件格式、参数说明以及配置示例。相机配置文件采用JSON格式,存储在`DeviceLibrary/Config/`目录下。
## 2. 配置文件格式 ## 2. 配置文件格式
...@@ -247,21 +247,13 @@ ...@@ -247,21 +247,13 @@
### 5.1 配置文件位置 ### 5.1 配置文件位置
相机配置文件存储在以下位置: 相机配置文件存储在执行目录的 `Config/` 文件夹下。
```
DeviceLibrary/
└── Config/
├── CameraA.json
├── CameraB.json
└── ...
```
### 5.2 配置加载流程 ### 5.2 配置加载流程
1. 系统启动时,`Camera.cs`类会扫描`Config`目录下的所有相机配置文件 1. 系统启动时,`CodeManager` 类会加载配置。
2. 根据配置文件中的信息初始化相应的相机设备 2. 自动寻找 `Config/IPCamera.json` 并初始化相机。
3. 如果配置文件不存在或格式错误,系统将使用默认配置 3. 加载 `Config/coverroi.json` 获取ROI信息。
### 5.3 配置修改方法 ### 5.3 配置修改方法
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
## 1. 概述 ## 1. 概述
本文档详细说明SISO系统中设备通信的配置方法,包括通信协议、配置文件格式、参数说明以及配置示例。设备通信配置对于系统各组件间的正常协作至关重要,用户应根据实际网络环境和设备情况正确配置相关参数。 本文档详细说明MIMO系统中设备通信的配置方法,包括通信协议、配置文件格式、参数说明以及配置示例。设备通信配置对于系统各组件间的正常协作至关重要,用户应根据实际网络环境和设备情况正确配置相关参数。
## 2. 通信架构 ## 2. 通信架构
SISO系统采用分层通信架构,主要包括以下几种通信方式: MIMO系统采用分层通信架构,主要包括以下几种通信方式:
- **控制器通信**:与运动控制器之间的通信 - **控制器通信**:与运动控制器之间的通信
- **设备通信**:与各类传感器、执行器的通信 - **设备通信**:与各类传感器、执行器的通信
...@@ -160,80 +160,31 @@ SISO系统采用分层通信架构,主要包括以下几种通信方式: ...@@ -160,80 +160,31 @@ SISO系统采用分层通信架构,主要包括以下几种通信方式:
## 4. 设备通信配置参数说明 ## 4. 设备通信配置参数说明
### 4.1 EtherCAT配置参数 ### 4.1 常用PRO配置参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| Master.Id | Integer | 主站ID | 是 |
| Master.Name | String | 主站名称 | 是 |
| Master.Port | Integer | 网络端口号 | 是 |
| Master.CycleTime | Integer | 通信周期时间(μs) | 是 |
| Master.Priority | String | 通信优先级 | 是 |
| Slave.Id | Integer | 从站ID | 是 |
| Slave.Name | String | 从站名称 | 是 |
| Slave.VendorId | Hex | 厂商ID | 是 |
| Slave.ProductCode | Hex | 产品代码 | 是 |
| Slave.Alias | Integer | 别名 | 否 |
| Slave.Position | Integer | 位置 | 是 |
### 4.2 Modbus配置参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| Port | String/Integer | 串口名称或TCP端口 | 是 |
| BaudRate | Integer | 波特率(RTU模式) | 是(RTU模式) |
| DataBits | Integer | 数据位(RTU模式) | 是(RTU模式) |
| StopBits | Integer | 停止位(RTU模式) | 是(RTU模式) |
| Parity | String | 校验位(RTU模式) | 是(RTU模式) |
| IpAddress | String | IP地址(TCP模式) | 是(TCP模式) |
| Timeout | Integer | 通信超时时间(ms) | 是 |
| Slave.Id | Integer | 从站ID | 是 |
| Slave.Name | String | 从站名称 | 是 |
| Slave.FunctionCode | Integer | 功能码 | 是 |
| Slave.StartingRegister | Integer | 起始寄存器地址 | 是 |
| Slave.RegisterCount | Integer | 寄存器数量 | 是 |
### 4.3 网络通信配置参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| Port | Integer | 网络端口号 | 是 |
| IpAddress | String | IP地址(客户端) | 是(客户端) |
| MaxConnections | Integer | 最大连接数 | 是 |
| BufferSize | Integer | 缓冲区大小 | 是 |
| Timeout | Integer | 超时时间(ms) | 是 |
| EnableSsl | Boolean | 是否启用SSL | 否 |
| AutoReconnect | Boolean | 是否自动重连 | 否 |
| ReconnectInterval | Integer | 重连间隔(ms) | 否 |
| Path | String | WebSocket路径 | 是(WebSocket) |
| HeartbeatInterval | Integer | 心跳间隔(ms) | 否(WebSocket) |
## 5. 配置文件管理 | 参数名 | 说明 |
|-----|-----|
### 5.1 配置文件位置 | Humiture_Port | 温湿度传感器连接的COM端口 |
| AIDevice_IP | 模拟量采集模块的IP地址 |
| AIDI*_Addr | 模拟量输入通道地址 |
配置文件通常存储在以下位置: ### 4.2 EtherCAT/Motion 参数
- 主配置目录: `/Config/Communication/` EtherCAT通信参数(如PDO映射、周期)通常在控制卡固件或底层驱动代码中固定,用户主要通过 `AXIS` 配置项调整轴号映射和运动参数。
- EtherCAT配置: `/Config/Communication/EtherCAT.xml`
- Modbus配置: `/Config/Communication/Modbus.json`
- 网络通信配置: `/Config/Communication/Network.json`
### 5.2 配置文件加载流程 ## 5. 配置文件管理
1. 系统启动时,自动加载通信配置文件 ### 5.1 配置文件位置
2. 验证配置文件格式和参数有效性
3. 根据配置初始化通信模块
4. 建立与各设备的通信连接
5. 监控通信状态,处理异常情况
### 5.3 动态配置更新 所有通信相关配置均包含在主配置文件中:
- `Core/Config/Config.csv`
系统支持运行时动态更新通信配置: ### 5.2 配置修改
- 通过API接口更新配置 1. 使用文本编辑器或Excel打开 `Config.csv`
- 通过Web界面更新配置 2. 找到 `PRO` 类型行。
- 配置更新后自动重新连接设备 3. 修改对应属性值(第5列)。
4. 保存文件并重启软件生效。
## 6. 通信诊断与故障排除 ## 6. 通信诊断与故障排除
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## 1. 概述 ## 1. 概述
本文档提供了SISO系统常见故障的诊断步骤和解决方案,旨在帮助技术人员快速识别和解决系统运行中遇到的问题。故障排除应遵循系统化的方法,从基础检查开始,逐步深入分析,最终解决问题。 本文档提供了MIMO系统常见故障的诊断步骤和解决方案,旨在帮助技术人员快速识别和解决系统运行中遇到的问题。故障排除应遵循系统化的方法,从基础检查开始,逐步深入分析,最终解决问题。
## 2. 故障诊断基本流程 ## 2. 故障诊断基本流程
...@@ -110,15 +110,12 @@ ...@@ -110,15 +110,12 @@
## 7. 日志分析指南 ## 7. 日志分析指南
### 7.1 日志级别说明 ### 7.1 日志级别说明
| 级别 | 说明 | 示例 | | 级别 | 说明 | 对应代码 |
|-----|------|------| |-----|------|------|
| FATAL | 致命错误,导致系统崩溃 | 硬件故障、核心服务崩溃 | | alarm | 报警,系统停止或需要立即处理 | `MsgLevel.alarm` |
| ERROR | 严重错误,影响系统功能 | 通信失败、设备连接断开 | | warning | 警告,可能影响流程但不致命 | `MsgLevel.warning` |
| WARN | 警告信息,可能导致问题 | 参数异常、资源不足 | | info | 一般信息,记录流程状态 | `MsgLevel.info` |
| INFO | 一般信息,记录重要事件 | 系统启动、模块加载 |
| DEBUG | 调试信息,用于问题诊断 | 函数调用、变量值 |
| TRACE | 详细跟踪信息,记录执行流程 | 代码路径、执行步骤 |
### 7.2 日志文件位置 ### 7.2 日志文件位置
...@@ -128,34 +125,31 @@ ...@@ -128,34 +125,31 @@
- 设备日志: `/Logs/Device/` - 设备日志: `/Logs/Device/`
- 错误日志: `/Logs/Error/` - 错误日志: `/Logs/Error/`
### 7.3 关键错误代码含义 ### 7.3 系统错误代码 (ErrInfo & AlarmInfo)
#### 7.3.1 通信错误代码 #### 7.3.1 常见错误枚举 (ErrInfo)
| 错误代码 | 说明 | 可能原因 | | 错误代码/枚举 | 说明 | 解决方案 |
|---------|------|--------| |---------|------|--------|
| ECOM001 | 连接失败 | 网络问题、目标不可达 | | `X09_BoxNotDetect` | 料叉传感器未检测到料盘 | 检查X30/X09传感器,确认料盘是否在位,手动确认或清除障碍 |
| ECOM002 | 超时错误 | 响应缓慢、网络延迟 | | `SuddenStop` | 急停按钮被按下或运动报警 | 检查急停按钮状态,检查轴运动是否受阻 |
| ECOM003 | 数据传输错误 | 协议不匹配、数据损坏 | | `RunBtn` | 运行按钮相关错误 | 检查操作面板按钮状态 |
| ECOM004 | 配置错误 | 参数设置不正确、配置文件损坏 | | `Res0008` | 服务器连接异常 | 检查网络连接,确认上位机服务是否启动 |
#### 7.3.2 设备错误代码 #### 7.3.2 报警类型 (AlarmInfo)
| 错误代码 | 说明 | 可能原因 | 系统内部定义的报警类型(AlarmType):
|---------|------|--------|
| EDEV001 | 设备未连接 | 电源问题、物理连接断开 |
| EDEV002 | 设备响应错误 | 设备故障、参数错误 |
| EDEV003 | 设备超时 | 通信问题、设备繁忙 |
| EDEV004 | 设备异常 | 内部错误、硬件故障 |
#### 7.3.3 系统错误代码 | 类型ID | 类别 | 详细说明 |
|---|---|---|
| 0 | 消息 | 原点返回、复位消息 |
| 1 | 总体错误 | 急停、气压不足、盘错乱 |
| 2 | 运动轴错误 | 轴1-4报警(旋转、升降、进出、压紧)、电缸报警 |
| 3 | IO报警 | 信号超时 |
| 错误代码 | 说明 | 可能原因 | #### 7.3.3 汇川(Huichuan)伺服报警
|---------|------|--------|
| ESYS001 | 初始化失败 | 配置错误、依赖缺失 | 系统通过 `HCBoardManager.GetAxisErrorDetail` 获取伺服驱动器的详细报警代码。请参考汇川伺服驱动器手册查询具体报警代码(如 E-xxx)。
| ESYS002 | 资源不足 | 内存不足、CPU过载 |
| ESYS003 | 访问权限错误 | 权限设置问题、用户权限不足 |
| ESYS004 | 文件操作错误 | 文件不存在、权限问题、磁盘空间不足 |
## 8. 预防性维护 ## 8. 预防性维护
......
# SISO系统用户手册 # MIMO系统用户手册
## 1. 简介 ## 1. 简介
### 1.1 文档目的 ### 1.1 文档目的
本文档旨在为SISO系统的操作人员提供全面的操作指南,包括系统概述、安装配置、日常操作、维护保养及故障处理等内容,帮助用户正确、安全、高效地使用本系统。 本文档旨在为MIMO系统的操作人员提供全面的操作指南,包括系统概述、安装配置、日常操作、维护保养及故障处理等内容,帮助用户正确、安全、高效地使用本系统。
### 1.2 适用对象 ### 1.2 适用对象
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
| 术语 | 解释说明 | | 术语 | 解释说明 |
|-----|--------| |-----|--------|
| SISO | Single Input Single Output,单输入单输出系统 | | MIMO | Multiple Input Multiple Output,多输入多输出系统 |
| PLC | Programmable Logic Controller,可编程逻辑控制器 | | PLC | Programmable Logic Controller,可编程逻辑控制器 |
| HMI | Human Machine Interface,人机界面 | | HMI | Human Machine Interface,人机界面 |
| EtherCAT | 工业以太网通信协议 | | EtherCAT | 工业以太网通信协议 |
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
### 2.1 系统功能 ### 2.1 系统功能
SISO系统是一个集运动控制、设备管理、数据采集和监控于一体的工业自动化控制系统,主要功能包括: MIMO系统是一个集运动控制、设备管理、数据采集和监控于一体的工业自动化控制系统,主要功能包括:
- 多轴运动控制 - 多轴运动控制
- 设备IO管理 - 设备IO管理
...@@ -480,14 +480,17 @@ IO监控界面用于监控和控制输入输出信号,主要功能包括: ...@@ -480,14 +480,17 @@ IO监控界面用于监控和控制输入输出信号,主要功能包括:
4. 记录报警原因和处理方法 4. 记录报警原因和处理方法
### 9.4 常见报警及处理 ### 9.4 常见报警及处理
| 报警代码 | 报警描述 | 可能原因 | 处理方法 | 系统报警分为以下几类(AlarmType):
|---------|--------|---------|--------|
| ALM001 | 轴位置超限 | 限位开关触发或软限位设置不当 | 检查机械位置,调整限位设置 | | 类型ID | 类别 | 描述 | 处理建议 |
| ALM002 | 伺服驱动器报警 | 伺服故障或参数设置错误 | 检查伺服驱动器报警代码,参考伺服手册处理 | |---|---|---|---|
| ALM003 | 通信超时 | 网络故障或设备无响应 | 检查网络连接,重启通信设备 | | 0 | 消息 | 原点返回、复位等提示信息 | 无需特殊处理,确认即可 |
| ALM004 | 电源电压异常 | 电源波动或故障 | 检查电源系统,必要时更换电源 | | 1 | 总体错误 | 急停被按下、气压不足、料盘错乱等 | 检查急停按钮、气源压力或料盘状态 |
| ALM005 | 温度过高 | 环境温度过高或冷却系统故障 | 改善通风条件,检查冷却系统 | | 2 | 运动轴错误 | 轴伺服报警、位置超限等 | 检查对应轴的机械状态和驱动器报警代码,清除报警后复位 |
| 3 | IO报警 | 信号超时、传感器未检测到等 | 检查相关传感器和气缸状态 |
具体的伺服报警代码(如E-xxx)请参考伺服驱动器手册。
## 10. 附录 ## 10. 附录
...@@ -532,19 +535,18 @@ IO监控界面用于监控和控制输入输出信号,主要功能包括: ...@@ -532,19 +535,18 @@ IO监控界面用于监控和控制输入输出信号,主要功能包括:
| Esc | 取消当前操作 | | Esc | 取消当前操作 |
### 10.3 联系方式 ### 10.3 联系方式
**技术支持热线**:400-123-4567
**邮箱**:support@siso-system.com
**网站**:www.siso-system.com
**服务时间**:周一至周五 9:00-18:00
### 10.4 版本历史
| 版本号 | 更新日期 | 更新内容 |
|-------|--------|--------|
| 1.0.0 | 2023-01-15 | 初始版本 |
| 1.1.0 | 2023-03-20 | 新增功能和性能优化 |
| 1.2.0 | 2023-06-10 | 修复已知问题,增强稳定性 |
\ No newline at end of file \ No newline at end of file
**技术支持热线**:400-XXX-XXXX
**邮箱**:support@mimo-system.com
**网站**:www.mimo-system.com
**服务时间**:周一至周五 9:00-18:00
### 10.4 版本历史
| 版本号 | 更新日期 | 更新内容 |
|-------|--------|--------|
| 1.0.0 | 2025-12-18 | MIMO系统初始版本 |
| 0.9.0 | 2023-01-15 | 原型版本 |
\ No newline at end of file \ No newline at end of file
...@@ -320,10 +320,6 @@ ...@@ -320,10 +320,6 @@
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Core\Core.csproj">
<Project>{bb23296c-aa1d-45c6-9fa6-5a37b2abfe9b}</Project>
<Name>Core</Name>
</ProjectReference>
<ProjectReference Include="..\Infrastructure\Common\Common.csproj"> <ProjectReference Include="..\Infrastructure\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project> <Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name> <Name>Common</Name>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!