Commit 6ba77d49 LN

结构优化

1 个父辈 292b0df8
正在显示 220 个修改的文件 包含 4924 行增加635 行删除
......@@ -74,91 +74,58 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DeviceLibrary\AcSerialBean.cs" />
<Compile Include="DeviceLibrary\Camera.cs" />
<Compile Include="DeviceLibrary\CameraTest.cs" />
<Compile Include="DeviceLibrary\CylinderManger.cs" />
<Compile Include="DeviceLibrary\dauxiKS107\DauxiKS107Controller.cs" />
<Compile Include="DeviceLibrary\flyelectronicControl\Flyelectronic_485_RGB_Controller.cs" />
<Compile Include="DeviceLibrary\IOMonitor.cs" />
<Compile Include="DeviceLibrary\IPCamera.cs" />
<Compile Include="DeviceLibrary\I_SafetyDevice.cs" />
<Compile Include="DeviceLibrary\LiftMonitor.cs" />
<Compile Include="DeviceLibrary\LineRunMonitor.cs" />
<Compile Include="DeviceLibrary\C8WeightSensor.cs" />
<Compile Include="DeviceLibrary\OKLEController.cs" />
<Compile Include="DeviceLibrary\ServerCommunication.cs" />
<Compile Include="DeviceLibrary\AxisBean.cs" />
<Compile Include="DeviceLibrary\ServerCommunication_AgvProcess.cs" />
<Compile Include="DeviceLibrary\VisionHelper.cs" />
<Compile Include="DeviceLibrary\weightSensor\OKLE_WeightSensor.cs" />
<Compile Include="Devices\Controllers\AcSerialBean.cs" />
<Compile Include="Devices\Camera\Camera.cs" />
<Compile Include="Devices\Camera\CameraTest.cs" />
<Compile Include="Devices\Controllers\CylinderManger.cs" />
<Compile Include="Devices\Controllers\dauxiKS107\DauxiKS107Controller.cs" />
<Compile Include="Devices\Controllers\flyelectronicControl\Flyelectronic_485_RGB_Controller.cs" />
<Compile Include="Devices\IO\IOMonitor.cs" />
<Compile Include="Devices\Controllers\IPCamera.cs" />
<Compile Include="Devices\Controllers\I_SafetyDevice.cs" />
<Compile Include="Devices\Controllers\LiftMonitor.cs" />
<Compile Include="Devices\Controllers\LineRunMonitor.cs" />
<Compile Include="Devices\Sensors\C8WeightSensor.cs" />
<Compile Include="Devices\Controllers\OKLEController.cs" />
<Compile Include="Communication\ServerCommunication.cs" />
<Compile Include="Devices\Controllers\AxisBean.cs" />
<Compile Include="Communication\ServerCommunication_AgvProcess.cs" />
<Compile Include="Devices\Controllers\VisionHelper.cs" />
<Compile Include="Devices\Sensors\weightSensor\OKLE_WeightSensor.cs" />
<Compile Include="TestRoi.cs" />
<Compile Include="theMachine\BoxTransport.cs" />
<Compile Include="theMachine\Common.cs" />
<Compile Include="theMachine\JobList.cs" />
<Compile Include="theMachine\LabelParam.cs" />
<Compile Include="theMachine\MainMachine _LedRGBProcess.cs" />
<Compile Include="theMachine\MainMachine_AGV.cs" />
<Compile Include="theMachine\MainMachine_ServerControl.cs" />
<Compile Include="theMachine\MainMachine _BtnProcess.cs" />
<Compile Include="theMachine\MainMachine _Common.cs" />
<Compile Include="theMachine\MainMachine _AutoInOutTest.cs" />
<Compile Include="theMachine\MainMachine_Clamp.cs" />
<Compile Include="theMachine\MainMachine_String.cs" />
<Compile Include="theMachine\MainMachine_Store.cs" />
<Compile Include="theMachine\MainMachine _IOMonitor.cs" />
<Compile Include="theMachine\MainMachine _LedProcess.cs" />
<Compile Include="theMachine\MainMachine.cs" />
<Compile Include="theMachine\MoveInfo.cs" />
<Compile Include="theMachine\MoveStep.cs" />
<Compile Include="DeviceLibrary\AlarmBuzzer.cs" />
<Compile Include="DeviceLibrary\CodeManager.cs" />
<Compile Include="theMachine\RobotManage.cs" />
<Compile Include="theMachine\IRobot.cs" />
<Compile Include="DeviceLibrary\IAxisManager.cs" />
<Compile Include="DeviceLibrary\AxisManager.cs" />
<Compile Include="DeviceLibrary\HC\HCAxisManager.cs" />
<Compile Include="DeviceLibrary\HC\HCIOManager.cs" />
<Compile Include="DeviceLibrary\I_IOManager.cs" />
<Compile Include="DeviceLibrary\IOManager.cs" />
<Compile Include="BusinessLogic\BoxTransport.cs" />
<Compile Include="MachineControl\Common.cs" />
<Compile Include="BusinessLogic\JobList.cs" />
<Compile Include="DataProcessing\LabelParam.cs" />
<Compile Include="MachineControl\Components\MainMachine _LedRGBProcess.cs" />
<Compile Include="MachineControl\Components\MainMachine_AGV.cs" />
<Compile Include="MachineControl\Components\MainMachine_ServerControl.cs" />
<Compile Include="MachineControl\Components\MainMachine _BtnProcess.cs" />
<Compile Include="MachineControl\Components\MainMachine _Common.cs" />
<Compile Include="MachineControl\Components\MainMachine _AutoInOutTest.cs" />
<Compile Include="MachineControl\Components\MainMachine_Clamp.cs" />
<Compile Include="MachineControl\Components\MainMachine_String.cs" />
<Compile Include="MachineControl\Components\MainMachine_Store.cs" />
<Compile Include="MachineControl\Components\MainMachine _IOMonitor.cs" />
<Compile Include="MachineControl\Components\MainMachine _LedProcess.cs" />
<Compile Include="MachineControl\MainMachine.cs" />
<Compile Include="BusinessLogic\MoveInfo.cs" />
<Compile Include="BusinessLogic\MoveStep.cs" />
<Compile Include="Devices\Controllers\AlarmBuzzer.cs" />
<Compile Include="Devices\Camera\CodeManager.cs" />
<Compile Include="MachineControl\RobotManage.cs" />
<Compile Include="MachineControl\IRobot.cs" />
<Compile Include="Devices\Axis\IAxisManager.cs" />
<Compile Include="Devices\Axis\AxisManager.cs" />
<Compile Include="Devices\Controllers\HC\HCAxisManager.cs" />
<Compile Include="Devices\Controllers\HC\HCIOManager.cs" />
<Compile Include="Devices\IO\I_IOManager.cs" />
<Compile Include="Devices\IO\IOManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="theMachine\SoundsController.cs" />
<Compile Include="userControl\AxisMoveControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="userControl\AxisMoveControl.Designer.cs">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</Compile>
<Compile Include="userControl\AxisTipControl.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="userControl\AxisTipControl.Designer.cs">
<DependentUpon>AxisTipControl.cs</DependentUpon>
</Compile>
<Compile Include="userControl\ToucDownBtn.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="DataProcessing\SoundsController.cs" />
<Compile Include="WindowManager.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="userControl\AxisMoveControl.resx">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="userControl\AxisTipControl.resx">
<DependentUpon>AxisTipControl.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\LoadCVSLibrary\LoadCSVLibrary.csproj">
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Config\Config.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
......@@ -176,6 +143,15 @@
<ItemGroup>
<WCFMetadata Include="Connected Services\" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<ProjectReference Include="..\Infrastructure\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\Infrastructure\LoadCVSLibrary\LoadCSVLibrary.csproj">
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using DeviceLibrary;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
public class HIKCamera
{
Thread camerathread;
//static HIKCamera _camera;
//Asa.Camera.VisionLib camera;
//public static HIKCamera Current
//{
// get
// {
// if (_camera == null)
// _camera = new HIKCamera();
// return _camera;
// }
//}
public string Name = "";
public event EventHandler<Bitmap> camera_event;
public string DeviceName = "monitor1";
public PictureBox picture = new PictureBox();
bool enableCamera = ConfigHelper.Config.Get("Func_EnableCam", true);
public bool LoadCameraConfig(string CameraID, out string msg, object preview = null)
{
Name = CameraID;
msg = "";
if (!enableCamera) return true;
string path = $".\\Config\\{CameraID}.json";
if (!File.Exists(path))
{
msg = Name + crc.GetString(L.monitor_config_not_exist, "找不到监控相机配置文件");
LogUtil.error(Name + "找不到监控相机配置文件" + path);
return false;
}
try
{
var configtxt = File.ReadAllText(path);
if (configtxt.IndexOf("Pwd") > 0)
{
configtxt = configtxt.Replace("Pwd", "Password");
configtxt = configtxt.Replace("\"8000\"", "8000");
File.WriteAllText(path, configtxt);
}
var m = Regex.Match(configtxt, "name\".*?\"(.+)\"", RegexOptions.IgnoreCase);
DeviceName = m.Groups[1].Value;
camera = new VisionLib(path, true, "HIK.IPCamera");
}
catch (Exception e)
{
msg = Name + crc.GetString(L.monitor_config_load_fail, "加载监控相机配置文件失败:") + e.ToString();
LogUtil.error(Name + "加载监控相机配置文件失败:" + e.ToString());
return false;
}
PictureBox p1 = new PictureBox();
camera.PreviewImage(DeviceName, p1.Handle);
//if (preview == null)
//{
// camera.PreviewImage(DeviceName, picture.Handle);
//}
//else
//{
// camera.PreviewImage(DeviceName, (IntPtr)preview);
//}
camera.Open(DeviceName);
Bitmap bmp = camera.GetImage(DeviceName);
if (bmp == null)
{
msg = Name + crc.GetString(L.monitor_open_fail, "监控相机打开失败");
LogUtil.error(Name + $"监控相机打开失败");
return false;
}
camera_event?.Invoke(this, bmp);
camerathread = new Thread(new ThreadStart(startCamera));
camerathread.Start();
GC.KeepAlive(camerathread);
return true;
}
int errortimes = 0;
bool camerathreadrun = true;
public void stopCamera()
{
camerathreadrun = false;
}
void startCamera()
{
int errorsleeptime = 5000;
camerathreadrun = true;
while (camerathreadrun)
{
try
{
Bitmap bmp = camera.GetImage(DeviceName);
if (bmp != null)
{
errortimes = 0;
errorsleeptime = 5000;
//saveTest(bmp);
camera_event?.Invoke(this, bmp);
}
else if (bmp == null && errortimes < 5)
{
errortimes++;
LogUtil.error(Name + $"相机获取图像出错,{errortimes}");
Thread.Sleep(errorsleeptime);
}
else if (errortimes == 5)
{
camera.Close(DeviceName);
Thread.Sleep(1000);
camera.Open(DeviceName);
errortimes = 0;
errorsleeptime = errorsleeptime * 2;
LogUtil.error(Name + $"相机错误次数过多,重新打开,{errortimes}");
}
else if (errortimes == 6)
{
LogUtil.error(Name + $"相机连接失败, 相机线程退出,{errortimes}");
break;
}
Thread.Sleep(1000 / 5);
}
catch
{
errortimes++;
}
}
try
{
camera.Close(DeviceName);
}
catch { }
camera.Dispose();
}
void saveTest(Bitmap bitmap)
{
if (!Directory.Exists(".\\TestImg"))
{
Directory.CreateDirectory(".\\TestImg");
}
bitmap.Save(Path.Combine(".\\TestImg\\", $"{DateTime.Now.ToString("yyyyMMddhhmmssfff")}.bmp"));
}
public void CameraGrabOne(string filename)
{
try
{
LogUtil.info(Name + "库位文件名:" + filename);
Bitmap bmp = camera.GetImage(DeviceName);
if (bmp != null)
{
if (File.Exists(filename))
File.Delete(filename);
bmp.Save(filename, ImageFormat.Jpeg);
bmp.Dispose();
}
}
catch (Exception e)
{
LogUtil.error(Name + e.ToString());
}
}
public string GetFixtureStateFilename(string PositionNum, string WareNumber, StoreMoveType storeMoveType, FixtureState fixtureState)
{
Path.GetInvalidFileNameChars().ToList().ForEach((ix) => { WareNumber = WareNumber.Replace(ix.ToString(), ""); });
if (WareNumber.Length > 150)
{
WareNumber = "";
}
if (string.IsNullOrEmpty(WareNumber))
WareNumber = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
string dir = $"\\image\\Fixture\\{storeMoveType}\\{PositionNum}\\";
Directory.CreateDirectory(dir);
string filename = $"{WareNumber}@@{fixtureState}.jpg";
foreach (var x in Path.GetInvalidFileNameChars())
{
filename = filename.Replace(x.ToString(), "");
}
return dir + filename;
}
}
public enum FixtureState
{
FromIn,
FromOut,
FromInSide,
FromOutSide,
ToIn,
ToOut,
ToInSide,
ToOutSide,
ToFix,
}
# 轴控制 API 文档
## 文档信息
| 项目 | 内容 |
|------|------|
| 版本 | 1.0.0 |
| 状态 | 正式版 |
| 编写日期 | 2025-12-16 |
| 最后更新 | 2025-12-16 |
| 编写人 | SISO 开发团队 |
## 更新日志
| 版本 | 日期 | 更新内容 | 编写人 |
|------|------|----------|--------|
| 1.0.0 | 2025-12-16 | 初始版本,包含轴管理器接口、轴控制方法、数据结构和异常处理 | SISO 开发团队 |
## 1. 概述
本文档详细介绍了 SISO 系统中轴控制相关的 API 接口,包括轴管理器接口、轴控制方法以及相关数据结构。这些 API 提供了对运动轴的初始化、控制、状态监控等功能的抽象和实现。
## 2. 轴管理器接口
### 2.1 IAxisManager 接口
`IAxisManager` 是轴控制模块的核心接口,定义了对运动轴进行管理和控制的基本操作。
```csharp
public interface IAxisManager
{
#region 初始化与关闭
/// <summary>
/// 初始化轴管理器
/// </summary>
/// <returns>初始化是否成功</returns>
bool Initialize();
/// <summary>
/// 使用指定配置初始化轴管理器
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <returns>初始化是否成功</returns>
bool Initialize(string configPath);
/// <summary>
/// 关闭轴管理器,释放资源
/// </summary>
void Close();
#endregion
#region 轴信息获取
/// <summary>
/// 获取所有轴的信息
/// </summary>
/// <returns>轴信息列表</returns>
List<AxisBean> GetAllAxes();
/// <summary>
/// 根据轴ID获取轴信息
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴信息对象,如果未找到返回null</returns>
AxisBean GetAxisById(int axisId);
/// <summary>
/// 获取轴的当前状态
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴状态枚举值</returns>
AxisStatus GetAxisStatus(int axisId);
/// <summary>
/// 获取轴的当前位置
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴的当前位置值</returns>
double GetAxisCurrentPosition(int axisId);
/// <summary>
/// 获取轴的当前速度
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴的当前速度值</returns>
double GetAxisCurrentSpeed(int axisId);
#endregion
#region 运动控制
/// <summary>
/// 控制轴点动
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="speed">点动速度</param>
/// <param name="isPositive">是否正方向</param>
/// <returns>操作是否成功</returns>
bool MoveAxisJog(int axisId, double speed, bool isPositive);
/// <summary>
/// 停止指定轴的运动
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>操作是否成功</returns>
bool StopAxis(int axisId);
/// <summary>
/// 停止所有轴的运动
/// </summary>
/// <returns>操作是否成功</returns>
bool StopAllAxes();
/// <summary>
/// 控制轴进行相对运动
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="distance">相对运动距离</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
bool MoveAxisRelative(int axisId, double distance, double speed);
/// <summary>
/// 控制轴进行绝对运动
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="position">目标位置</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
bool MoveAxisAbsolute(int axisId, double position, double speed);
/// <summary>
/// 控制轴回零
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>操作是否成功</returns>
bool HomeAxis(int axisId);
/// <summary>
/// 控制轴回零(带参数)
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="homeMode">回零模式</param>
/// <param name="homeSpeed">回零速度</param>
/// <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.1 AxisBean 类
`AxisBean` 类用于表示轴的属性和状态信息。
```csharp
public class AxisBean
{
/// <summary>
/// 轴ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// 轴名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 当前位置
/// </summary>
public double CurrentPosition { get; set; }
/// <summary>
/// 目标位置
/// </summary>
public double TargetPosition { get; set; }
/// <summary>
/// 当前速度
/// </summary>
public double CurrentSpeed { get; set; }
/// <summary>
/// 最大速度
/// </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; }
}
```
### 3.2 枚举类型
#### 3.2.1 AxisStatus 枚举
表示轴的运行状态。
```csharp
public enum AxisStatus
{
/// <summary>
/// 未知状态
/// </summary>
Unknown = 0,
/// <summary>
/// 空闲状态
/// </summary>
Idle = 1,
/// <summary>
/// 运动中
/// </summary>
Moving = 2,
/// <summary>
/// 回零中
/// </summary>
Homing = 3,
/// <summary>
/// 已回零
/// </summary>
Homed = 4,
/// <summary>
/// 报警状态
/// </summary>
Alarm = 5,
/// <summary>
/// 错误状态
/// </summary>
Error = 6,
/// <summary>
/// 限位状态
/// </summary>
InLimit = 7
}
```
#### 3.2.2 HomeMode 枚举
表示回零模式。
```csharp
public enum HomeMode
{
/// <summary>
/// 主动回零(向限位方向运动找原点)
/// </summary>
ActiveHome = 0,
/// <summary>
/// 被动回零(等待外部触发回零信号)
/// </summary>
PassiveHome = 1,
/// <summary>
/// 感应回零(通过原点传感器信号回零)
/// </summary>
SensorHome = 2
}
```
## 4. 具体实现类
### 4.1 AxisManager 类
`AxisManager``IAxisManager` 接口的具体实现类,负责实际的轴控制操作。
```csharp
public class AxisManager : IAxisManager
{
#region 成员变量
private bool _isInitialized = false;
private Dictionary<int, AxisBean> _axisMap = new Dictionary<int, AxisBean>();
private Dictionary<int, Action<int, AxisStatus>> _statusChangeHandlers = new Dictionary<int, Action<int, AxisStatus>>();
private Dictionary<int, Action<int>> _positionReachedHandlers = new Dictionary<int, Action<int>>();
private object _lockObj = new object();
#endregion
#region 构造函数
/// <summary>
/// 默认构造函数
/// </summary>
public AxisManager()
{
// 初始化默认配置
InitializeDefaultConfig();
}
/// <summary>
/// 使用配置文件路径构造
/// </summary>
/// <param name="configPath">配置文件路径</param>
public AxisManager(string configPath)
{
if (string.IsNullOrEmpty(configPath))
{
throw new ArgumentNullException(nameof(configPath));
}
Initialize(configPath);
}
#endregion
#region IAxisManager 接口实现
/// <summary>
/// 初始化轴管理器
/// </summary>
/// <returns>初始化是否成功</returns>
public bool Initialize()
{
return Initialize("DefaultAxisConfig.xml");
}
/// <summary>
/// 使用指定配置初始化轴管理器
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <returns>初始化是否成功</returns>
public bool Initialize(string configPath)
{
lock (_lockObj)
{
if (_isInitialized)
{
return true;
}
try
{
// 加载配置文件
var config = LoadConfig(configPath);
// 初始化轴映射
InitializeAxisMap(config);
// 初始化硬件连接
InitializeHardware();
_isInitialized = true;
return true;
}
catch (Exception ex)
{
Console.WriteLine($"初始化轴管理器失败: {ex.Message}");
return false;
}
}
}
/// <summary>
/// 关闭轴管理器,释放资源
/// </summary>
public void Close()
{
lock (_lockObj)
{
if (!_isInitialized)
{
return;
}
try
{
// 停止所有轴运动
StopAllAxes();
// 释放硬件资源
ReleaseHardware();
// 清空事件处理器
_statusChangeHandlers.Clear();
_positionReachedHandlers.Clear();
// 清空轴映射
_axisMap.Clear();
_isInitialized = false;
}
catch (Exception ex)
{
Console.WriteLine($"关闭轴管理器失败: {ex.Message}");
}
}
}
/// <summary>
/// 获取所有轴的信息
/// </summary>
/// <returns>轴信息列表</returns>
public List<AxisBean> GetAllAxes()
{
lock (_lockObj)
{
if (!_isInitialized)
{
throw new AxisInitializationException("轴管理器尚未初始化");
}
return _axisMap.Values.ToList();
}
}
/// <summary>
/// 根据轴ID获取轴信息
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴信息对象,如果未找到返回null</returns>
public AxisBean GetAxisById(int axisId)
{
lock (_lockObj)
{
if (!_isInitialized)
{
throw new AxisInitializationException("轴管理器尚未初始化");
}
_axisMap.TryGetValue(axisId, out var axis);
return axis;
}
}
/// <summary>
/// 获取轴的当前状态
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴状态枚举值</returns>
public AxisStatus GetAxisStatus(int axisId)
{
var axis = GetAxisById(axisId);
if (axis == null)
{
throw new AxisOperationException($"未找到ID为{axisId}的轴");
}
// 实时更新轴状态
UpdateAxisStatus(axis);
return axis.Status;
}
/// <summary>
/// 获取轴的当前位置
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴的当前位置值</returns>
public double GetAxisCurrentPosition(int axisId)
{
var axis = GetAxisById(axisId);
if (axis == null)
{
throw new AxisOperationException($"未找到ID为{axisId}的轴");
}
// 实时更新轴位置
UpdateAxisPosition(axis);
return axis.CurrentPosition;
}
/// <summary>
/// 获取轴的当前速度
/// </summary>
/// <param name="axisId">轴ID</param>
/// <returns>轴的当前速度值</returns>
public double GetAxisCurrentSpeed(int axisId)
{
var axis = GetAxisById(axisId);
if (axis == null)
{
throw new AxisOperationException($"未找到ID为{axisId}的轴");
}
// 实时更新轴速度
UpdateAxisSpeed(axis);
return axis.CurrentSpeed;
}
/// <summary>
/// 控制轴点动
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="speed">点动速度</param>
/// <param name="isPositive">是否正方向</param>
/// <returns>操作是否成功</returns>
public bool MoveAxisJog(int axisId, double speed, bool isPositive)
{
var axis = GetAxisById(axisId);
if (axis == null)
{
throw new AxisOperationException($"未找到ID为{axisId}的轴");
}
if (speed <= 0)
{
throw new ArgumentException("速度必须大于0", nameof(speed));
}
lock (_lockObj)
{
try
{
// 发送点动命令到硬件
SendJogCommandToHardware(axis, speed, isPositive);
// 更新轴状态
axis.Status = AxisStatus.Moving;
OnAxisStatusChanged(axisId, axis.Status);
return true;
}
catch (Exception ex)
{
throw new AxisOperationException($"轴{axisId}点动失败: {ex.Message}", ex);
}
}
}
// 其他IAxisManager接口方法的实现...
// 由于篇幅限制,此处省略部分实现代码
// 完整实现请参考源代码
/// <summary>
/// 多轴同步运动(绝对位置)
/// </summary>
/// <param name="targetPositions">各轴目标位置映射表,key为轴ID,value为目标位置</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
public bool MoveMultipleAxesSynchronously(Dictionary<int, double> targetPositions, double speed)
{
return MoveMultipleAxesSynchronously(targetPositions, speed, 0, 0);
}
/// <summary>
/// 多轴同步运动(绝对位置,带加速度和减速度)
/// </summary>
/// <param name="targetPositions">各轴目标位置映射表,key为轴ID,value为目标位置</param>
/// <param name="speed">运动速度</param>
/// <param name="acceleration">加速度</param>
/// <param name="deceleration">减速度</param>
/// <returns>操作是否成功</returns>
public bool MoveMultipleAxesSynchronously(Dictionary<int, double> targetPositions, double speed, double acceleration, double deceleration)
{
if (targetPositions == null || targetPositions.Count == 0)
{
throw new ArgumentException("目标位置映射表不能为空", nameof(targetPositions));
}
if (speed <= 0)
{
throw new ArgumentException("速度必须大于0", nameof(speed));
}
lock (_lockObj)
{
try
{
// 验证所有轴是否存在
foreach (int axisId in targetPositions.Keys)
{
if (!_axisMap.ContainsKey(axisId))
{
throw new AxisOperationException(axisId, "MoveMultiple", $"未找到ID为{axisId}的轴");
}
}
// 计算各轴运动参数
Dictionary<int, MotionParams> motionParams = CalculateMotionParams(targetPositions, speed, acceleration, deceleration);
// 发送同步运动命令到硬件
SendSyncMotionCommandToHardware(motionParams);
// 更新各轴状态
foreach (int axisId in targetPositions.Keys)
{
_axisMap[axisId].Status = AxisStatus.Moving;
_axisMap[axisId].TargetPosition = targetPositions[axisId];
OnAxisStatusChanged(axisId, AxisStatus.Moving);
}
return true;
}
catch (Exception ex)
{
throw new AxisOperationException(0, "MoveMultiple", $"多轴同步运动失败: {ex.Message}", ex);
}
}
}
/// <summary>
/// 多轴同步相对运动
/// </summary>
/// <param name="relativeDistances">各轴相对运动距离映射表,key为轴ID,value为相对距离</param>
/// <param name="speed">运动速度</param>
/// <returns>操作是否成功</returns>
public bool MoveMultipleAxesSynchronouslyRelative(Dictionary<int, double> relativeDistances, double speed)
{
if (relativeDistances == null || relativeDistances.Count == 0)
{
throw new ArgumentException("相对距离映射表不能为空", nameof(relativeDistances));
}
// 计算绝对目标位置
Dictionary<int, double> targetPositions = new Dictionary<int, double>();
foreach (var kvp in relativeDistances)
{
int axisId = kvp.Key;
double distance = kvp.Value;
if (!_axisMap.ContainsKey(axisId))
{
throw new AxisOperationException(axisId, "MoveMultipleRelative", $"未找到ID为{axisId}的轴");
}
double currentPos = _axisMap[axisId].CurrentPosition;
targetPositions[axisId] = currentPos + distance;
}
// 调用绝对运动方法
return MoveMultipleAxesSynchronously(targetPositions, speed);
}
/// <summary>
/// 等待所有指定轴运动完成
/// </summary>
/// <param name="axisIds">轴ID列表,若为null或空则等待所有轴</param>
/// <param name="timeout">超时时间(毫秒),0表示无限等待</param>
/// <returns>是否在超时前完成运动</returns>
public bool WaitForMotionCompletion(List<int> axisIds = null, int timeout = 0)
{
if (!_isInitialized)
{
throw new AxisInitializationException("轴管理器尚未初始化");
}
List<int> axesToWait = axisIds;
if (axesToWait == null || axesToWait.Count == 0)
{
axesToWait = _axisMap.Keys.ToList();
}
long startTime = DateTime.Now.Ticks;
long timeoutTicks = timeout * 10000; // 转换为 ticks
while (true)
{
bool allCompleted = true;
// 检查所有指定轴的状态
foreach (int axisId in axesToWait)
{
if (!_axisMap.ContainsKey(axisId))
{
continue;
}
// 实时更新轴状态
UpdateAxisStatus(_axisMap[axisId]);
// 检查轴是否不在运动状态
if (_axisMap[axisId].Status == AxisStatus.Moving || _axisMap[axisId].Status == AxisStatus.Homing)
{
allCompleted = false;
break;
}
}
if (allCompleted)
{
return true;
}
// 检查是否超时
if (timeout > 0)
{
long elapsedTicks = DateTime.Now.Ticks - startTime;
if (elapsedTicks > timeoutTicks)
{
throw new AxisTimeoutException(0, timeout, "多轴运动等待超时");
}
}
// 短暂休眠,避免CPU占用过高
Thread.Sleep(50);
}
}
#endregion
#region 内部辅助方法
/// <summary>
/// 运动参数类
/// </summary>
private class MotionParams
{
/// <summary>
/// 轴ID
/// </summary>
public int AxisId { get; set; }
/// <summary>
/// 目标位置
/// </summary>
public double TargetPosition { get; set; }
/// <summary>
/// 运动速度
/// </summary>
public double Speed { get; set; }
/// <summary>
/// 加速度
/// </summary>
public double Acceleration { get; set; }
/// <summary>
/// 减速度
/// </summary>
public double Deceleration { get; set; }
/// <summary>
/// 运动距离
/// </summary>
public double Distance { get; set; }
/// <summary>
/// 运动时间
/// </summary>
public double MotionTime { get; set; }
}
/// <summary>
/// 初始化默认配置
/// </summary>
private void InitializeDefaultConfig()
{
// 初始化默认轴配置
// ...
}
/// <summary>
/// 加载配置文件
/// </summary>
/// <param name="configPath">配置文件路径</param>
/// <returns>配置对象</returns>
private AxisConfig LoadConfig(string configPath)
{
// 加载并解析配置文件
// ...
return new AxisConfig();
}
/// <summary>
/// 初始化轴映射
/// </summary>
/// <param name="config">轴配置对象</param>
private void InitializeAxisMap(AxisConfig config)
{
// 根据配置初始化轴映射
// ...
}
/// <summary>
/// 初始化硬件连接
/// </summary>
private void InitializeHardware()
{
// 初始化硬件驱动和连接
// ...
}
/// <summary>
/// 释放硬件资源
/// </summary>
private void ReleaseHardware()
{
// 释放硬件驱动和连接
// ...
}
/// <summary>
/// 实时更新轴状态
/// </summary>
/// <param name="axis">轴对象</param>
private void UpdateAxisStatus(AxisBean axis)
{
// 从硬件获取最新状态并更新
// ...
}
/// <summary>
/// 实时更新轴位置
/// </summary>
/// <param name="axis">轴对象</param>
private void UpdateAxisPosition(AxisBean axis)
{
// 从硬件获取最新位置并更新
// ...
}
/// <summary>
/// 实时更新轴速度
/// </summary>
/// <param name="axis">轴对象</param>
private void UpdateAxisSpeed(AxisBean axis)
{
// 从硬件获取最新速度并更新
// ...
}
/// <summary>
/// 发送点动命令到硬件
/// </summary>
/// <param name="axis">轴对象</param>
/// <param name="speed">点动速度</param>
/// <param name="isPositive">是否正方向</param>
private void SendJogCommandToHardware(AxisBean axis, double speed, bool isPositive)
{
// 实际的硬件通信代码
// ...
}
/// <summary>
/// 计算运动参数
/// </summary>
/// <param name="targetPositions">目标位置映射表</param>
/// <param name="speed">运动速度</param>
/// <param name="acceleration">加速度</param>
/// <param name="deceleration">减速度</param>
/// <returns>运动参数映射表</returns>
private Dictionary<int, MotionParams> CalculateMotionParams(Dictionary<int, double> targetPositions, double speed, double acceleration, double deceleration)
{
Dictionary<int, MotionParams> motionParamsMap = new Dictionary<int, MotionParams>();
double maxMotionTime = 0;
// 第一遍计算:计算各轴运动距离和所需时间
foreach (int axisId in targetPositions.Keys)
{
AxisBean axis = _axisMap[axisId];
double currentPos = axis.CurrentPosition;
double targetPos = targetPositions[axisId];
double distance = Math.Abs(targetPos - currentPos);
// 使用默认加速度和减速度(如果未指定)
double axisAcc = acceleration > 0 ? acceleration : axis.Acceleration;
double axisDec = deceleration > 0 ? deceleration : axis.Deceleration;
// 计算运动时间
double motionTime = CalculateMotionTime(distance, speed, axisAcc, axisDec);
MotionParams params = new MotionParams
{
AxisId = axisId,
TargetPosition = targetPos,
Speed = speed,
Acceleration = axisAcc,
Deceleration = axisDec,
Distance = distance,
MotionTime = motionTime
};
motionParamsMap.Add(axisId, @params);
// 更新最大运动时间
if (motionTime > maxMotionTime)
{
maxMotionTime = motionTime;
}
}
// 第二遍计算:调整各轴速度,确保同步完成
foreach (var kvp in motionParamsMap)
{
MotionParams @params = kvp.Value;
// 如果轴的运动时间小于最大时间,调整其速度以匹配最大时间
if (@params.MotionTime < maxMotionTime && @params.MotionTime > 0)
{
double speedRatio = @params.MotionTime / maxMotionTime;
@params.Speed = speed * speedRatio;
// 重新计算加速度和减速度,保持比例
@params.Acceleration *= speedRatio;
@params.Deceleration *= speedRatio;
// 更新运动时间
@params.MotionTime = maxMotionTime;
}
}
return motionParamsMap;
}
/// <summary>
/// 计算运动时间
/// </summary>
/// <param name="distance">运动距离</param>
/// <param name="speed">运动速度</param>
/// <param name="acceleration">加速度</param>
/// <param name="deceleration">减速度</param>
/// <returns>运动时间(秒)</returns>
private double CalculateMotionTime(double distance, double speed, double acceleration, double deceleration)
{
// 计算运动时间的公式
// ...
return distance / speed;
}
/// <summary>
/// 发送同步运动命令到硬件
/// </summary>
/// <param name="motionParams">运动参数映射表</param>
private void SendSyncMotionCommandToHardware(Dictionary<int, MotionParams> motionParams)
{
// 发送同步运动命令到硬件
// ...
}
/// <summary>
/// 触发轴状态变化事件
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="status">新状态</param>
private void OnAxisStatusChanged(int axisId, AxisStatus status)
{
// 触发状态变化事件
// ...
}
/// <summary>
/// 触发轴位置到达事件
/// </summary>
/// <param name="axisId">轴ID</param>
private void OnAxisPositionReached(int axisId)
{
// 触发位置到达事件
// ...
}
#endregion
}
```
### 4.2 AxisConfig 类
`AxisConfig` 类用于存储轴管理器的配置信息。
```csharp
public class AxisConfig
{
/// <summary>
/// 轴配置列表
/// </summary>
public List<SingleAxisConfig> AxesConfig { get; set; }
/// <summary>
/// 通信超时时间(毫秒)
/// </summary>
public int CommunicationTimeout { get; set; } = 5000;
/// <summary>
/// 状态更新间隔(毫秒)
/// </summary>
public int StatusUpdateInterval { get; set; } = 100;
/// <summary>
/// 是否启用日志
/// </summary>
public bool EnableLogging { get; set; } = true;
}
/// <summary>
/// 单轴配置类
/// </summary>
public class SingleAxisConfig
{
/// <summary>
/// 轴ID
/// </summary>
public int AxisId { get; set; }
/// <summary>
/// 轴名称
/// </summary>
public string AxisName { get; set; }
/// <summary>
/// 最大速度
/// </summary>
public double MaxSpeed { get; set; }
/// <summary>
/// 加速度
/// </summary>
public double Acceleration { get; set; }
/// <summary>
/// 减速度
/// </summary>
public double Deceleration { get; set; }
/// <summary>
/// 回零模式
/// </summary>
public HomeMode HomeMode { get; set; }
/// <summary>
/// 回零速度
/// </summary>
public double HomeSpeed { get; set; }
}
```
## 5. 异常处理
轴控制模块定义了特定的异常类型,用于表示不同类型的轴操作异常。所有轴相关异常都继承自 `DeviceException` 基类,提供统一的异常处理机制。
### 5.1 异常类层次结构
```
DeviceException
└── AxisException
├── AxisInitializationException
├── AxisCommunicationException
├── AxisOperationException
├── AxisTimeoutException
├── AxisLimitException
└── AxisAlarmException
```
### 5.2 异常类具体定义
```csharp
/// <summary>
/// 轴异常基类
/// </summary>
public class AxisException : DeviceException
{
/// <summary>
/// 轴ID
/// </summary>
public int? AxisId { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="message">异常消息</param>
public AxisException(string message) : base(message)
{}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="message">异常消息</param>
/// <param name="innerException">内部异常</param>
public AxisException(string message, Exception innerException) : base(message, innerException)
{}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="message">异常消息</param>
public AxisException(int axisId, string message) : base(message)
{
AxisId = axisId;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="message">异常消息</param>
/// <param name="innerException">内部异常</param>
public AxisException(int axisId, string message, Exception innerException) : base(message, innerException)
{
AxisId = axisId;
}
}
/// <summary>
/// 轴初始化异常
/// </summary>
public class AxisInitializationException : AxisException
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="message">异常消息</param>
public AxisInitializationException(string message) : base(message) {}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="message">异常消息</param>
/// <param name="innerException">内部异常</param>
public AxisInitializationException(string message, Exception innerException) : base(message, innerException) {}
}
/// <summary>
/// 轴通信异常
/// </summary>
public class AxisCommunicationException : AxisException
{
/// <summary>
/// 通信端口
/// </summary>
public string Port { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="port">通信端口</param>
/// <param name="message">异常消息</param>
public AxisCommunicationException(int axisId, string port, string message) : base(axisId, message)
{
Port = port;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="port">通信端口</param>
/// <param name="message">异常消息</param>
/// <param name="innerException">内部异常</param>
public AxisCommunicationException(int axisId, string port, string message, Exception innerException)
: base(axisId, message, innerException)
{
Port = port;
}
}
/// <summary>
/// 轴操作异常
/// </summary>
public class AxisOperationException : AxisException
{
/// <summary>
/// 操作类型
/// </summary>
public string OperationType { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="operationType">操作类型</param>
/// <param name="message">异常消息</param>
public AxisOperationException(int axisId, string operationType, string message) : base(axisId, message)
{
OperationType = operationType;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="operationType">操作类型</param>
/// <param name="message">异常消息</param>
/// <param name="innerException">内部异常</param>
public AxisOperationException(int axisId, string operationType, string message, Exception innerException)
: base(axisId, message, innerException)
{
OperationType = operationType;
}
}
/// <summary>
/// 轴操作超时异常
/// </summary>
public class AxisTimeoutException : AxisException
{
/// <summary>
/// 超时时间(毫秒)
/// </summary>
public int Timeout { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="timeout">超时时间(毫秒)</param>
/// <param name="message">异常消息</param>
public AxisTimeoutException(int axisId, int timeout, string message) : base(axisId, message)
{
Timeout = timeout;
}
}
/// <summary>
/// 轴限位异常
/// </summary>
public class AxisLimitException : AxisException
{
/// <summary>
/// 是否为正向限位
/// </summary>
public bool IsPositiveLimit { get; private set; }
/// <summary>
/// 当前位置
/// </summary>
public double CurrentPosition { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="isPositiveLimit">是否为正向限位</param>
/// <param name="currentPosition">当前位置</param>
/// <param name="message">异常消息</param>
public AxisLimitException(int axisId, bool isPositiveLimit, double currentPosition, string message)
: base(axisId, message)
{
IsPositiveLimit = isPositiveLimit;
CurrentPosition = currentPosition;
}
}
/// <summary>
/// 轴报警异常
/// </summary>
public class AxisAlarmException : AxisException
{
/// <summary>
/// 报警代码
/// </summary>
public int AlarmCode { get; private set; }
/// <summary>
/// 报警描述
/// </summary>
public string AlarmDescription { get; private set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="axisId">轴ID</param>
/// <param name="alarmCode">报警代码</param>
/// <param name="alarmDescription">报警描述</param>
/// <param name="message">异常消息</param>
public AxisAlarmException(int axisId, int alarmCode, string alarmDescription, string message)
: base(axisId, message)
{
AlarmCode = alarmCode;
AlarmDescription = alarmDescription;
}
}
```
### 5.3 异常使用示例
```csharp
// 异常捕获和处理示例
IAxisManager axisManager = new AxisManager();
try
{
// 初始化轴管理器
if (!axisManager.Initialize())
{
throw new AxisInitializationException("轴管理器初始化失败");
}
// 回零操作
if (!axisManager.HomeAxis(1))
{
throw new AxisOperationException(1, "Home", "轴1回零失败");
}
// 绝对运动
if (!axisManager.MoveAxisAbsolute(1, 100.0, 10.0))
{
throw new AxisOperationException(1, "MoveAbsolute", "轴1绝对运动失败");
}
// 等待运动完成
Thread.Sleep(2000);
// 获取当前位置
double currentPosition = axisManager.GetAxisCurrentPosition(1);
Console.WriteLine($"轴1当前位置: {currentPosition}");
}
catch (AxisTimeoutException ex)
{
Console.WriteLine($"轴{ex.AxisId}操作超时: {ex.Message}, 超时时间: {ex.Timeout}ms");
// 处理超时异常,例如重试操作
}
catch (AxisLimitException ex)
{
Console.WriteLine($"轴{ex.AxisId}限位异常: {ex.Message}, 方向: {(ex.IsPositiveLimit ? "正向" : "负向")}, 当前位置: {ex.CurrentPosition}");
// 处理限位异常,例如反向运动解除限位
}
catch (AxisAlarmException ex)
{
Console.WriteLine($"轴{ex.AxisId}报警: {ex.Message}, 报警代码: {ex.AlarmCode}, 报警描述: {ex.AlarmDescription}");
// 处理报警异常,例如重置报警
}
catch (AxisException ex)
{
Console.WriteLine($"轴{ex.AxisId}异常: {ex.Message}");
// 处理其他轴异常
}
catch (Exception ex)
{
Console.WriteLine($"未知异常: {ex.Message}");
// 处理其他非轴异常
}
finally
{
// 关闭轴管理器,释放资源
axisManager?.Close();
}
```
### 5.4 异常处理最佳实践
1. **分层捕获**:根据异常类型进行分层捕获,优先处理特定类型的异常,再处理通用异常。
2. **详细日志**:在捕获异常时,记录详细的异常信息,包括轴ID、操作类型、错误代码等,便于问题定位。
3. **合理重试**:对于通信异常或超时异常,可以考虑进行合理的重试机制,但需设置最大重试次数,避免无限重试。
4. **安全停止**:在捕获到严重异常时,应确保所有轴停止运动,避免发生安全事故。
5. **用户友好**:将技术异常转换为用户友好的错误信息,避免直接向用户展示底层技术细节。
6. **资源清理**:在 `finally` 块中确保释放所有资源,包括轴管理器、硬件连接等。
## 6. 使用示例
### 6.1 基本用法
```csharp
// 创建并初始化轴管理器
IAxisManager axisManager = new AxisManager();
if (axisManager.Initialize())
{
try
{
// 获取轴1的信息
AxisBean axis1 = axisManager.GetAxisById(1);
Console.WriteLine($"Axis 1 current position: {axis1.CurrentPosition}");
// 检查轴是否已回零
if (!axis1.IsHomed)
{
Console.WriteLine("Axis 1 is not homed. Homing now...");
axisManager.HomeAxis(1);
Console.WriteLine("Homing completed.");
}
// 控制轴1以10mm/s的速度移动到100mm位置
Console.WriteLine("Moving axis 1 to position 100mm...");
if (axisManager.MoveAxisAbsolute(1, 100.0, 10.0))
{
Console.WriteLine("Move command sent successfully.");
}
}
catch (AxisException ex)
{
Console.WriteLine($"Axis error: {ex.Message}");
}
finally
{
// 关闭轴管理器
axisManager.Close();
}
}
else
{
Console.WriteLine("Failed to initialize axis manager.");
}
```
### 6.2 事件处理
```csharp
// 创建并初始化轴管理器
IAxisManager axisManager = new AxisManager();
if (axisManager.Initialize())
{
// 注册轴状态变化事件处理函数
axisManager.RegisterAxisStatusChangeHandler((axisId, status) => {
Console.WriteLine($"Axis {axisId} status changed to: {status}");
});
// 注册轴位置到达事件处理函数
axisManager.RegisterAxisPositionReachedHandler(axisId => {
Console.WriteLine($"Axis {axisId} has reached target position.");
});
// 执行轴运动操作
// ...
}
```
### 6.3 多轴同步运动
```csharp
// 创建并初始化轴管理器
IAxisManager axisManager = new AxisManager();
if (axisManager.Initialize())
{
try
{
// 假设我们有一个多轴同步运动的扩展方法
// 控制轴1和轴2同时运动到指定位置
Dictionary<int, double> targetPositions = new Dictionary<int, double>
{
{ 1, 100.0 },
{ 2, 200.0 }
};
double speed = 10.0;
// 执行多轴同步运动(这是一个扩展的高级功能)
// axisManager.MoveMultipleAxesSynchronously(targetPositions, speed);
Console.WriteLine("Multi-axis synchronous movement completed.");
}
catch (AxisException ex)
{
Console.WriteLine($"Multi-axis movement error: {ex.Message}");
}
finally
{
// 关闭轴管理器
axisManager.Close();
}
}
```
## 7. 最佳实践
1. **初始化和资源释放**:始终确保在使用轴管理器后正确关闭它,以释放资源。
2. **错误处理**:捕获并处理所有可能的轴操作异常,确保系统稳定运行。
3. **状态检查**:在执行关键操作前,始终检查轴的当前状态,确保操作安全。
4. **回零操作**:在执行精确位置控制前,确保轴已经正确回零。
5. **事件驱动编程**:使用事件机制响应轴状态变化,而不是轮询。
6. **参数验证**:在调用API前,验证所有输入参数的有效性。
## 8. 注意事项
1. 轴控制操作是实时性要求较高的任务,应避免在主线程中执行耗时操作。
2. 在多线程环境中使用轴管理器时,需要注意线程安全问题。
3. 不同的物理轴可能有不同的特性和限制,使用时应参考具体的硬件说明书。
4. 轴的运动参数(速度、加速度、减速度等)应根据实际设备情况和应用需求合理设置。
5. 轴操作异常时,应及时停止相关操作,并采取适当的安全措施。
\ No newline at end of file
# DeviceLibrary API 文档
## 1. 概述
DeviceLibrary 是 SISO 系统中的设备控制层核心库,提供了统一的设备抽象和控制接口,支持各类工业设备的接入和控制。本文档详细介绍了 DeviceLibrary 提供的主要 API 接口及其使用方法。
## 2. 核心接口
### 2.1 IAxisManager 接口
轴管理器接口,提供对运动轴的管理和控制功能。
```csharp
public interface IAxisManager
{
/// <summary>
/// 初始化轴管理器
/// </summary>
bool Initialize();
/// <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>
bool StopAxis(int axisId);
/// <summary>
/// 设置轴位置
/// </summary>
bool SetAxisPosition(int axisId, double position);
/// <summary>
/// 轴回零
/// </summary>
bool HomeAxis(int axisId);
/// <summary>
/// 获取轴状态
/// </summary>
AxisStatus GetAxisStatus(int axisId);
}
```
### 2.2 I_IOManager 接口
IO 管理器接口,提供对 IO 信号的管理和控制功能。
```csharp
public interface I_IOManager
{
/// <summary>
/// 初始化IO管理器
/// </summary>
bool Initialize();
/// <summary>
/// 关闭IO管理器
/// </summary>
void Close();
/// <summary>
/// 读取输入信号状态
/// </summary>
bool ReadInput(int ioId);
/// <summary>
/// 写入输出信号状态
/// </summary>
bool WriteOutput(int ioId, bool value);
/// <summary>
/// 批量读取输入信号状态
/// </summary>
Dictionary<int, bool> ReadInputs(List<int> ioIds);
/// <summary>
/// 批量写入输出信号状态
/// </summary>
bool WriteOutputs(Dictionary<int, bool> ioValues);
/// <summary>
/// 注册IO状态变化事件处理器
/// </summary>
void RegisterIOChangeHandler(int ioId, Action<int, bool> handler);
}
```
### 2.3 I_SafetyDevice 接口
安全设备接口,提供对安全相关设备的管理和监控功能。
```csharp
public interface I_SafetyDevice
{
/// <summary>
/// 初始化安全设备
/// </summary>
bool Initialize();
/// <summary>
/// 关闭安全设备
/// </summary>
void Close();
/// <summary>
/// 获取安全状态
/// </summary>
SafetyStatus GetSafetyStatus();
/// <summary>
/// 重置安全状态
/// </summary>
bool ResetSafetyStatus();
/// <summary>
/// 注册安全状态变化事件处理器
/// </summary>
void RegisterSafetyStatusChangeHandler(Action<SafetyStatus> handler);
}
```
### 2.4 IRobot 接口
机器人设备接口,提供对机器人设备的管理和控制功能。
```csharp
public interface IRobot
{
/// <summary>
/// 初始化机器人
/// </summary>
bool Initialize();
/// <summary>
/// 关闭机器人
/// </summary>
void Close();
/// <summary>
/// 获取机器人当前位置
/// </summary>
RobotPosition GetCurrentPosition();
/// <summary>
/// 移动机器人到指定位置
/// </summary>
bool MoveToPosition(RobotPosition position, double speed);
/// <summary>
/// 执行机器人程序
/// </summary>
bool ExecuteProgram(string programName, Dictionary<string, object> parameters = null);
/// <summary>
/// 停止机器人运动
/// </summary>
bool StopMotion();
/// <summary>
/// 获取机器人状态
/// </summary>
RobotStatus GetRobotStatus();
}
```
## 3. 具体实现类
### 3.1 AxisManager 类
轴管理器的具体实现,提供对运动轴的管理和控制。
```csharp
public class AxisManager : IAxisManager
{
// 实现 IAxisManager 接口的所有方法
// ...
}
```
### 3.2 IOManager 类
IO 管理器的具体实现,提供对 IO 信号的管理和控制。
```csharp
public class IOManager : I_IOManager
{
// 实现 I_IOManager 接口的所有方法
// ...
}
```
### 3.3 Camera 类
相机设备的抽象和控制实现。
```csharp
public class Camera
{
/// <summary>
/// 初始化相机
/// </summary>
public bool Initialize(string cameraConfigPath);
/// <summary>
/// 关闭相机
/// </summary>
public void Close();
/// <summary>
/// 开始采集图像
/// </summary>
public bool StartAcquisition();
/// <summary>
/// 停止采集图像
/// </summary>
public void StopAcquisition();
/// <summary>
/// 采集单张图像
/// </summary>
public Bitmap CaptureImage();
/// <summary>
/// 设置相机参数
/// </summary>
public bool SetParameter(string paramName, object value);
/// <summary>
/// 获取相机参数
/// </summary>
public object GetParameter(string paramName);
}
```
### 3.4 C8WeightSensor 类
C8系列重量传感器的实现。
```csharp
public class C8WeightSensor
{
/// <summary>
/// 初始化传感器
/// </summary>
public bool Initialize(string portName, int baudRate);
/// <summary>
/// 关闭传感器
/// </summary>
public void Close();
/// <summary>
/// 获取当前重量值
/// </summary>
public double GetWeight();
/// <summary>
/// 零点校准
/// </summary>
public bool ZeroCalibration();
/// <summary>
/// 量程校准
/// </summary>
public bool SpanCalibration(double calibrationWeight);
/// <summary>
/// 设置采样频率
/// </summary>
public bool SetSamplingRate(int rate);
}
```
## 4. 设备通信模块
### 4.1 ServerCommunication 类
与服务器通信的模块,实现数据上传和命令接收功能。
```csharp
public class ServerCommunication
{
/// <summary>
/// 初始化通信连接
/// </summary>
public bool Initialize(string serverAddress, int port);
/// <summary>
/// 关闭通信连接
/// </summary>
public void Close();
/// <summary>
/// 发送数据到服务器
/// </summary>
public bool SendData(string data);
/// <summary>
/// 注册命令接收事件处理器
/// </summary>
public void RegisterCommandReceivedHandler(Action<string> handler);
/// <summary>
/// 检查连接状态
/// </summary>
public bool IsConnected();
}
```
## 5. 辅助工具类
### 5.1 CodeManager 类
条码管理工具类,提供条码生成和解析功能。
```csharp
public class CodeManager
{
/// <summary>
/// 生成条码
/// </summary>
public string GenerateCode(string prefix, int sequenceNumber);
/// <summary>
/// 验证条码格式
/// </summary>
public bool ValidateCode(string code);
/// <summary>
/// 解析条码信息
/// </summary>
public CodeInfo ParseCode(string code);
}
```
### 5.2 ConfigManager 类
配置管理工具类,提供配置文件的读取和保存功能。
```csharp
public class ConfigManager
{
/// <summary>
/// 从文件加载配置
/// </summary>
public static T LoadConfig<T>(string configPath) where T : class, new();
/// <summary>
/// 保存配置到文件
/// </summary>
public static bool SaveConfig<T>(string configPath, T config) where T : class;
/// <summary>
/// 获取默认配置路径
/// </summary>
public static string GetDefaultConfigPath(string configName);
}
```
## 6. 异常处理
DeviceLibrary 定义了一系列自定义异常类,用于表示不同类型的设备操作异常:
- `DeviceInitializationException`:设备初始化异常
- `DeviceCommunicationException`:设备通信异常
- `DeviceOperationException`:设备操作异常
- `DeviceTimeoutException`:设备超时异常
这些异常继承自 `DeviceException` 基类,可以通过捕获基类来处理所有设备相关异常。
## 7. 使用示例
### 7.1 轴控制示例
```csharp
// 创建并初始化轴管理器
IAxisManager axisManager = new AxisManager();
if (axisManager.Initialize())
{
try
{
// 使轴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控制示例
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
try
{
// 读取输入点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();
}
}
```
## 8. 总结
DeviceLibrary 提供了丰富的设备控制和管理 API,支持各类工业设备的接入和控制。通过统一的接口设计和完善的异常处理机制,使得设备操作更加简单、可靠。开发者可以基于这些 API 快速构建自己的工业自动化应用。
\ No newline at end of file
# IO控制 API 文档
## 1. 概述
本文档详细介绍了 SISO 系统中 IO 控制相关的 API 接口,包括 IO 管理器接口、IO 信号读写方法、状态监控以及相关数据结构。这些 API 提供了对系统输入输出信号的统一管理和控制功能。
## 2. IO管理器接口
### 2.1 I_IOManager 接口
`I_IOManager` 是 IO 控制模块的核心接口,定义了对 IO 信号进行管理和操作的基本方法。
```csharp
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. 数据结构
### 3.1 IOInfo 类
`IOInfo` 类用于表示 IO 点的属性和配置信息。
```csharp
public class IOInfo
{
/// <summary>
/// IO点ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// IO点名
/// </summary>
public string Name { get; set; }
/// <summary>
/// IO点类型(输入/输出)
/// </summary>
public IOType Type { get; set; }
/// <summary>
/// IO点描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 物理地址
/// </summary>
public string PhysicalAddress { get; set; }
/// <summary>
/// 是否反转(取反)
/// </summary>
public bool IsInverted { get; set; }
/// <summary>
/// 默认值
/// </summary>
public bool DefaultValue { get; set; }
/// <summary>
/// 是否是安全相关IO
/// </summary>
public bool IsSafetyRelated { get; set; }
/// <summary>
/// 当前值(仅用于信息展示,不保证实时性)
/// </summary>
public bool CurrentValue { get; set; }
}
```
### 3.2 枚举类型
#### 3.2.1 IOType 枚举
表示 IO 点类型。
```csharp
public enum IOType
{
/// <summary>
/// 输入点
/// </summary>
Input = 0,
/// <summary>
/// 输出点
/// </summary>
Output = 1,
/// <summary>
/// 模拟输入
/// </summary>
AnalogInput = 2,
/// <summary>
/// 模拟输出
/// </summary>
AnalogOutput = 3
}
```
## 4. 监控接口
### 4.1 IOMonitor 类
`IOMonitor` 类用于监控 IO 状态变化,提供实时的 IO 状态更新和事件通知。
```csharp
public class IOMonitor
{
/// <summary>
/// 初始化IO监控器
/// </summary>
/// <param name="ioManager">IO管理器实例</param>
public IOMonitor(I_IOManager ioManager);
/// <summary>
/// 开始监控
/// </summary>
/// <param name="scanIntervalMs">扫描间隔(毫秒)</param>
public void StartMonitoring(int scanIntervalMs = 50);
/// <summary>
/// 停止监控
/// </summary>
public void StopMonitoring();
/// <summary>
/// IO状态变化事件
/// </summary>
public event Action<int, bool, bool> IOStateChanged; // 参数:IO点ID,旧状态,新状态
/// <summary>
/// 监控状态事件
/// </summary>
public event Action<bool> MonitoringStateChanged; // 参数:是否正在监控
}
```
## 5. 具体实现类
### 5.1 IOManager 类
`IOManager``I_IOManager` 接口的具体实现类,负责实际的 IO 控制操作。
```csharp
public class IOManager : I_IOManager
{
// 实现 I_IOManager 接口的所有方法
// ...
}
```
## 6. 异常处理
IO 控制模块定义了特定的异常类型,用于表示不同类型的 IO 操作异常:
- `IOInitializationException`:IO 初始化异常
- `IOCommunicationException`:IO 通信异常
- `IOOperationException`:IO 操作异常
- `IOTimeoutException`:IO 操作超时异常
- `IOConfigException`:IO 配置异常
这些异常都继承自 `DeviceException` 基类。
## 7. 使用示例
### 7.1 基本用法
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
try
{
// 读取输入点10的状态
bool inputState = ioManager.ReadInput(10);
Console.WriteLine($"Input 10 state: {inputState}");
// 写入输出点5为true
if (ioManager.WriteOutput(5, true))
{
Console.WriteLine("Output 5 set to true successfully.");
}
// 延时1秒后将输出点5设为false
Thread.Sleep(1000);
ioManager.WriteOutput(5, false);
}
catch (IOException ex)
{
Console.WriteLine($"IO error: {ex.Message}");
}
finally
{
// 关闭IO管理器
ioManager.Close();
}
}
else
{
Console.WriteLine("Failed to initialize IO manager.");
}
```
### 7.2 事件处理
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
// 注册IO状态变化事件处理函数
ioManager.RegisterIOChangeHandler(10, (ioId, value) => {
Console.WriteLine($"IO {ioId} changed to: {value}");
});
// 注册所有IO点的变化事件(-1表示所有IO点)
ioManager.RegisterIOChangeHandler(-1, (ioId, value) => {
Console.WriteLine($"[Global] IO {ioId} changed to: {value}");
});
// 执行IO操作
// ...
}
```
### 7.3 批量操作
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
try
{
// 批量读取输入点状态
List<int> inputIds = new List<int> { 10, 11, 12, 13 };
Dictionary<int, bool> inputStates = ioManager.ReadInputs(inputIds);
foreach (var kvp in inputStates)
{
Console.WriteLine($"Input {kvp.Key} state: {kvp.Value}");
}
// 批量写入输出点状态
Dictionary<int, bool> outputValues = new Dictionary<int, bool>
{
{ 1, true },
{ 2, false },
{ 3, true },
{ 4, false }
};
if (ioManager.WriteOutputs(outputValues))
{
Console.WriteLine("All outputs written successfully.");
}
}
catch (IOException ex)
{
Console.WriteLine($"IO batch operation error: {ex.Message}");
}
finally
{
// 关闭IO管理器
ioManager.Close();
}
}
```
### 7.4 高级功能
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
try
{
// 设置输出点闪烁(亮500ms,灭500ms,闪烁5次)
ioManager.BlinkOutput(5, 500, 500, 5);
// 延时输出(5秒后将输出点6设为true)
ioManager.DelayedWriteOutput(6, true, 5000);
Console.WriteLine("Advanced IO functions set up successfully.");
}
catch (IOException ex)
{
Console.WriteLine($"Advanced IO error: {ex.Message}");
}
finally
{
// 关闭IO管理器前停止所有闪烁
ioManager.StopBlinkOutput();
// 关闭IO管理器
ioManager.Close();
}
}
```
### 7.5 使用IO监控器
```csharp
// 创建并初始化IO管理器
I_IOManager ioManager = new IOManager();
if (ioManager.Initialize())
{
// 创建IO监控器
IOMonitor ioMonitor = new IOMonitor(ioManager);
// 注册IO状态变化事件
ioMonitor.IOStateChanged += (ioId, oldValue, newValue) => {
Console.WriteLine($"IO {ioId} changed from {oldValue} to {newValue}");
};
// 开始监控,扫描间隔为100ms
ioMonitor.StartMonitoring(100);
Console.WriteLine("IO monitoring started. Press any key to stop.");
Console.ReadKey();
// 停止监控
ioMonitor.StopMonitoring();
// 关闭IO管理器
ioManager.Close();
}
```
## 8. 最佳实践
1. **初始化和资源释放**:始终确保在使用 IO 管理器后正确关闭它,以释放资源。
2. **错误处理**:捕获并处理所有可能的 IO 操作异常,确保系统稳定运行。
3. **批量操作**:对于多个 IO 点的操作,优先使用批量操作方法,提高效率。
4. **事件驱动**:使用事件机制响应 IO 状态变化,避免频繁轮询。
5. **命名规范**:使用有意义的 IO 点名,便于系统维护和故障排查。
6. **配置管理**:通过配置文件管理 IO 映射关系,提高系统的可配置性和可维护性。
## 9. 注意事项
1. IO 操作通常是实时性要求较高的任务,应避免在主线程中频繁执行 IO 操作。
2. 对于需要实时监控的场景,建议使用 `IOMonitor` 类而不是自行实现轮询逻辑。
3. 批量读写操作比单个操作更高效,特别是在需要同时访问多个 IO 点时。
4. 某些高级功能(如闪烁、延时输出)可能需要占用额外的系统资源,应谨慎使用。
5. 在多线程环境中使用 IO 管理器时,需要注意线程安全问题。
\ No newline at end of file
# Layer5 (边缘计算层) 和 Layer6 (设备控制层) 详细设计
## 1. 概述
本文档详细描述了SISO系统中的Layer5(边缘计算层)和Layer6(设备控制层)的架构设计、组件关系和实现方式。这两层是系统与物理设备交互的核心,负责设备控制、数据采集和边缘计算处理。
## 2. Layer6 (设备控制层)
### 2.1 架构概览
设备控制层作为系统的底层,直接与物理设备进行交互,提供统一的设备抽象和控制接口。
#### 核心组件
- **设备抽象接口**:定义了各类设备的统一操作接口
- **设备管理器**:负责设备的生命周期管理和状态监控
- **通信协议适配器**:处理不同通信协议的转换
- **数据采集模块**:负责从设备获取实时数据
#### 目录结构
```
DeviceLibrary/
├── Interfaces/ # 设备抽象接口
│ ├── IAxisManager.cs # 轴管理器接口
│ ├── I_IOManager.cs # IO管理器接口
│ ├── I_SafetyDevice.cs # 安全设备接口
│ └── IRobot.cs # 机器人接口
├── Implementations/ # 具体实现
│ ├── Axis/ # 轴控制相关实现
│ ├── IO/ # IO控制相关实现
│ ├── Sensors/ # 传感器实现
│ └── Actuators/ # 执行器实现
├── Helpers/ # 辅助工具类
└── Configs/ # 设备配置文件
```
### 2.2 主要模块说明
#### 2.2.1 轴控制模块
负责控制和监控运动轴的状态和行为,提供运动控制的基本功能。
- **AxisManager**:管理所有运动轴,提供统一的控制接口
- **AxisBean**:描述轴的属性和状态信息
- **运动指令封装**:封装各类运动指令如点动、连续运动等
#### 2.2.2 IO控制模块
管理系统的输入输出信号,处理数字量和模拟量的读写操作。
- **IOManager**:管理所有IO点,提供IO读写功能
- **IOMonitor**:监控IO状态变化,触发相应事件
- **IO映射管理**:维护IO点与实际物理设备的映射关系
#### 2.2.3 传感器模块
处理各类传感器数据的采集和处理,包括重量传感器、视觉传感器等。
- **C8WeightSensor**:C8系列重量传感器实现
- **OKLE_WeightSensor**:OKLE系列重量传感器实现
- **Camera**:相机设备抽象和控制
### 2.3 设备接口设计原则
- **接口隔离**:每个设备接口专注于特定类型设备的操作
- **依赖倒置**:高层模块依赖于抽象接口,不依赖于具体实现
- **单一职责**:每个类只负责单一功能领域的任务
- **可扩展性**:设计支持轻松添加新设备类型和通信协议
## 3. Layer5 (边缘计算层)
### 3.1 架构概览
边缘计算层位于设备控制层之上,负责处理设备数据、实现业务逻辑和协调设备间的交互。
#### 核心组件
- **业务逻辑处理器**:实现核心业务逻辑
- **状态管理器**:维护系统状态和设备状态
- **任务调度器**:协调和调度各类任务执行
- **数据处理引擎**:进行边缘数据处理和分析
#### 目录结构
```
TheMachine/
├── Core/ # 核心业务逻辑
│ ├── MainMachine.cs # 主机器控制逻辑
│ ├── RobotManage.cs # 机器人管理逻辑
│ └── BoxTransport.cs # 料箱传输控制逻辑
├── Controllers/ # 控制器
│ ├── AxisControl.cs # 轴控制界面控制器
│ ├── IOControls.cs # IO控制界面控制器
│ └── SettingControl.cs # 设置界面控制器
├── Services/ # 服务层
│ ├── JobManagement/ # 任务管理服务
│ ├── StateManagement/ # 状态管理服务
│ └── EventProcessing/ # 事件处理服务
└── Utils/ # 工具类
```
### 3.2 主要功能模块
#### 3.2.1 机器控制模块
作为系统的核心,协调各设备完成整体任务流程。
- **MainMachine**:实现主机器控制逻辑,协调各子系统工作
- **状态机设计**:使用状态机模式管理系统运行状态转换
- **任务协调**:协调各设备完成复杂任务序列
#### 3.2.2 机器人管理模块
管理机器人设备,实现机器人的运动控制和任务执行。
- **RobotManage**:机器人设备的管理和控制
- **运动规划**:简单的运动路径规划和避障
- **任务执行**:执行预设的机器人任务序列
#### 3.2.3 数据处理和分析
对从设备层采集的数据进行处理、分析和存储。
- **数据过滤**:过滤和清洗原始传感器数据
- **边缘分析**:在边缘设备上进行简单的数据统计和分析
- **数据存储**:管理本地数据存储和缓存
## 4. 层间交互设计
### 4.1 通信机制
Layer5和Layer6之间采用以下通信机制:
- **接口调用**:Layer5通过接口直接调用Layer6提供的服务
- **事件通知**:Layer6通过事件机制向Layer5通知设备状态变化
- **异步通信**:关键操作采用异步方式执行,避免阻塞主线程
### 4.2 数据流设计
- **下行数据流**:指令从Layer5传递到Layer6,最终执行到物理设备
- **上行数据流**:设备状态和传感器数据从Layer6采集后传递到Layer5
- **数据转换**:在两层之间进行数据格式和语义的转换
## 5. 设计模式应用
### 5.1 创建型模式
- **工厂模式**:用于创建不同类型的设备实例
- **单例模式**:管理全局唯一的设备管理器实例
### 5.2 结构型模式
- **适配器模式**:适配不同类型的设备通信协议
- **装饰器模式**:为设备操作添加额外功能(如日志、监控等)
### 5.3 行为型模式
- **状态模式**:管理系统和设备的状态转换
- **命令模式**:封装设备操作指令
- **观察者模式**:实现设备状态变化的通知机制
## 6. 性能和安全考虑
### 6.1 性能优化
- **资源池化**:对频繁创建的对象使用对象池
- **异步操作**:关键操作采用异步方式执行
- **缓存机制**:缓存常用配置和状态信息
### 6.2 安全机制
- **访问控制**:对设备操作进行权限控制
- **故障恢复**:实现自动故障检测和恢复机制
- **日志审计**:记录关键操作和状态变化,便于审计和故障排查
## 7. 扩展性设计
### 7.1 新设备接入
设计支持通过以下方式轻松接入新设备:
- **接口实现**:实现相应的设备接口
- **配置注册**:在配置文件中注册新设备信息
- **驱动适配**:开发相应的设备驱动适配器
### 7.2 功能扩展
系统支持通过以下方式扩展功能:
- **插件机制**:支持加载自定义功能插件
- **配置化**:关键参数和行为支持配置化调整
- **事件扩展**:通过事件机制支持功能扩展
## 8. 总结
Layer5和Layer6作为SISO系统的核心组成部分,通过清晰的分层设计和接口定义,实现了设备控制和边缘计算功能的有效分离和协作。这种设计使得系统具有良好的可维护性、可扩展性和可靠性,能够满足工业自动化场景的需求。
\ No newline at end of file
# SISO系统架构概述
## 1. 系统简介
SISO(Single Input Single Output)系统是一个工业自动化控制平台,用于管理和控制各类工业设备,包括运动轴、传感器、执行器等。系统采用分层架构设计,实现了设备控制、数据处理、业务逻辑和用户交互的有效分离。
## 2. 整体架构
### 2.1 分层架构
SISO系统采用经典的分层架构设计,从上到下依次分为以下几层:
1. **表现层(Layer 1-2)**:用户界面和交互组件
2. **应用层(Layer 3-4)**:业务应用和功能模块
3. **边缘计算层(Layer 5)**:数据处理和业务逻辑
4. **设备控制层(Layer 6)**:设备抽象和控制接口
5. **设备层(Layer 7)**:物理设备和硬件接口
本文档主要关注系统的Layer5和Layer6部分。
### 2.2 核心组件关系
系统的主要组件及其关系如下:
```
┌─────────────────────────────────────────────────┐
│ 表现层 (Layer 1-2) │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ 主界面 │ │ 配置界面 │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
└──────────┼──────────────────┼───────────────────┘
│ │
┌──────────┼──────────────────┼───────────────────┐
│ │ │ │
│ ┌───────▼───────┐ ┌───────▼───────┐ │
│ │ 应用服务 │ │ 业务模块 │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ └──────────┬───────┘ │
│ │ │
│ 边缘计算层 (Layer 5) │
│ ┌─────────────────▼─────────────────┐ │
│ │ MainMachine (主控) │ │
│ ├─────────────────┬─────────────────┤ │
│ │ RobotManage │ BoxTransport │ │
│ └─────────────────┴─────────────────┘ │
│ │ │
│ ┌──────────┴──────────┐ │
│ │ │ │
└──────────┼─────────────────────┼───────────────┘
│ │
┌──────────▼─────────┐ ┌─────────▼─────────┐
│ 设备控制层 │ │ 设备控制层 │
│ (Layer 6 - 轴控) │ │ (Layer 6 - IO) │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ AxisManager │ │ │ │ IOManager │ │
│ └─────────────┘ │ │ └─────────────┘ │
└───────────────────┘ └───────────────────┘
│ │
┌──────────┴─────────┐ ┌─────────┴─────────┐
│ 设备层 │ │ 设备层 │
│ (Layer 7 - 电机) │ │ (Layer 7 - IO板) │
└───────────────────┘ └───────────────────┘
```
## 3. 主要功能模块
### 3.1 设备控制层 (Layer 6)
设备控制层负责提供统一的设备抽象和控制接口,主要包括:
- **轴控制**:管理运动轴的状态和运动
- **IO控制**:管理输入输出信号
- **传感器管理**:处理各类传感器数据
- **执行器控制**:控制各类执行器动作
### 3.2 边缘计算层 (Layer 5)
边缘计算层负责处理设备数据、实现业务逻辑和协调设备交互,主要包括:
- **机器控制**:协调各设备完成整体任务流程
- **任务管理**:管理和调度各类任务
- **状态监控**:监控系统和设备状态
- **数据处理**:对采集的数据进行处理和分析
## 4. 技术架构
### 4.1 开发技术栈
- **开发语言**:C#/.NET Framework
- **UI框架**:Windows Forms
- **通信协议**:TCP/IP、串口通信
- **设备驱动**:自定义驱动和第三方库
### 4.2 关键技术特性
- **多线程处理**:使用多线程处理设备通信和数据采集
- **异步操作**:关键操作采用异步方式执行
- **事件驱动**:基于事件机制实现组件间通信
- **配置化设计**:支持通过配置文件定制系统行为
## 5. 系统扩展性
### 5.1 设备扩展
系统设计支持轻松接入新类型设备:
- 实现相应的设备接口
- 在设备管理器中注册新设备
- 配置设备参数和通信方式
### 5.2 功能扩展
系统支持通过以下方式扩展功能:
- 开发新的业务模块和服务
- 实现自定义的设备控制逻辑
- 添加新的用户界面组件
## 6. 系统维护
### 6.1 日志系统
系统集成了完善的日志记录机制,记录关键操作、错误信息和系统状态,便于问题排查和系统监控。
### 6.2 故障恢复
系统实现了基本的故障检测和恢复机制,在设备异常时能够采取相应的保护措施。
## 7. 总结
SISO系统采用分层架构设计,实现了设备控制和业务逻辑的有效分离,具有良好的可维护性、可扩展性和可靠性。系统的Layer5和Layer6部分作为连接应用层和物理设备的桥梁,在系统中扮演着至关重要的角色。
\ No newline at end of file
# 轴配置说明
## 1. 概述
本文档详细说明SISO系统中运动轴的配置方法,包括配置文件格式、参数说明以及配置示例。轴配置对于系统的运动控制精度和稳定性至关重要,用户应根据实际设备情况正确配置相关参数。
## 2. 配置文件格式
轴配置可以通过配置文件或系统界面进行设置。配置文件通常采用XML或JSON格式,存储在系统配置目录中。
### 2.1 基本配置结构
```xml
<?xml version="1.0" encoding="utf-8" ?>
<AxesConfig>
<Axes>
<Axis>
<Id>1</Id>
<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>
<!-- IO映射 -->
<IOMapping>
<PositiveLimitSensor>1</PositiveLimitSensor>
<NegativeLimitSensor>2</NegativeLimitSensor>
<HomeSensor>3</HomeSensor>
<ServoEnable>11</ServoEnable>
<ServoAlarm>12</ServoAlarm>
</IOMapping>
</Axis>
<!-- 更多轴配置... -->
</Axes>
</AxesConfig>
```
## 3. 配置参数说明
### 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 运动参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| MaxSpeed | Double | 最大运动速度 | 是 |
| MaxAcceleration | Double | 最大加速度 | 是 |
| MaxDeceleration | Double | 最大减速度 | 是 |
| Jerk | Double | 加加速度 | 否 |
| HomeSpeed | Double | 回零速度 | 是 |
| JogSpeed | Double | 点动速度 | 是 |
| CreepSpeed | Double | 爬行速度(用于精确定位) | 否 |
### 3.5 限位配置
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| PositiveLimit | Double | 正向软限位值 | 否 |
| NegativeLimit | Double | 负向软限位值 | 否 |
| SoftLimitEnable | Boolean | 是否启用软限位 | 否 |
| HardLimitEnable | Boolean | 是否启用硬限位 | 否 |
### 3.6 回零配置
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| 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. 回零模式说明
| 回零模式 | 描述 |
|--------|------|
| ActiveLimitHome | 主动回零(碰到限位后返回) |
| PassiveHome | 被动回零(等待外部信号触发) |
| SensorHome | 传感器回零(找到原点传感器信号) |
| IndexHome | 编码器索引回零 |
| NoHome | 无需回零 |
## 5. 配置示例
### 5.1 X轴配置示例
```xml
<Axis>
<Id>1</Id>
<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 旋转轴配置示例
```xml
<Axis>
<Id>4</Id>
<Name>Theta-Axis</Name>
<Type>Rotary</Type>
<MotorType>Servo</MotorType>
<ControllerId>1</ControllerId>
<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. 参数调整建议
### 5.1 运动参数调整
- **速度参数**:根据负载情况和设备刚性调整,避免机械振动
- **加速度/减速度**:过大可能导致机械冲击,过小会影响效率
- **加加速度(Jerk)**:平滑运动过渡,减少振动
- **回零参数**:回零速度不宜过快,确保定位准确性
### 5.2 安全参数
- **限位配置**:确保硬限位和软限位都正确设置,避免机械碰撞
- **方向设置**:确保运动方向正确,避免反方向运动造成危险
- **使能控制**:设置正确的伺服使能信号,确保安全运行
## 6. 常见问题与解决方案
### 6.1 运动精度问题
- 检查编码器参数设置是否正确
- 确认机械传动部分是否存在间隙或松动
- 调整速度和加速度参数,减少振动
### 6.2 回零异常
- 确认回零传感器安装位置和连接是否正确
- 检查回零模式设置是否与实际硬件匹配
- 调整回零速度和方向参数
### 6.3 运动不平滑
- 增加Jerk参数值,使速度变化更加平滑
- 检查机械系统是否有卡滞或摩擦过大的情况
- 调整PID参数(如果控制器支持)
### 6.4 限位触发
- 确认限位传感器连接和设置是否正确
- 检查软限位参数是否设置合理
- 确认轴的运动范围与实际机械结构匹配
\ No newline at end of file
# 相机配置说明
## 1. 概述
本文档详细说明SISO系统中相机设备的配置方法,包括配置文件格式、参数说明以及配置示例。相机配置文件采用JSON格式,存储在`DeviceLibrary/Config/`目录下。
## 2. 配置文件格式
相机配置文件采用JSON格式,每个相机对应一个配置文件,文件名格式为`Camera[相机标识].json`,例如`CameraA.json`
### 2.1 基本结构
```json
{
"CameraInfo": {
"CameraId": "CameraA",
"Model": "HIKVISION_MV-CA050-10GC",
"IpAddress": "192.168.1.10",
"Port": 8000,
"Manufacturer": "HIKVISION",
"FirmwareVersion": "V3.2.0"
},
"ImageSettings": {
"Width": 2592,
"Height": 2048,
"PixelFormat": "Mono8",
"AcquisitionMode": "Continuous",
"ExposureTime": 5000,
"Gain": 0.0,
"FrameRate": 25.0,
"TriggerMode": "Off"
},
"ROI": {
"Enable": false,
"OffsetX": 0,
"OffsetY": 0,
"Width": 2592,
"Height": 2048
},
"Processing": {
"EnableBinning": false,
"BinX": 1,
"BinY": 1,
"EnableDecimation": false,
"DecimationX": 1,
"DecimationY": 1
},
"Advanced": {
"BalanceRatioRed": 1.0,
"BalanceRatioGreen": 1.0,
"BalanceRatioBlue": 1.0,
"Gamma": 1.0,
"BlackLevel": 0,
"WhiteBalanceMode": "Off",
"Sharpness": 0.0
},
"Storage": {
"SaveRawImages": false,
"SaveProcessedImages": false,
"ImageSavePath": "Images",
"ImageFormat": "PNG"
}
}
```
## 3. 配置参数说明
### 3.1 CameraInfo 部分
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| CameraId | String | 相机唯一标识,必须与文件名对应 | 是 |
| Model | String | 相机型号 | 是 |
| IpAddress | String | 相机IP地址(对于网络相机) | 对于网络相机必需 |
| Port | Integer | 相机端口(对于网络相机) | 对于网络相机必需 |
| Manufacturer | String | 相机制造商 | 否 |
| FirmwareVersion | String | 相机固件版本 | 否 |
### 3.2 ImageSettings 部分
| 参数 | 类型 | 说明 | 是否必需 | 默认值 |
|-----|------|-----|--------|-------|
| Width | Integer | 图像宽度(像素) | 是 | 相机默认分辨率 |
| Height | Integer | 图像高度(像素) | 是 | 相机默认分辨率 |
| PixelFormat | String | 像素格式(Mono8, RGB8, BGR8等) | 是 | Mono8 |
| AcquisitionMode | String | 采集模式(Continuous, SingleFrame, MultiFrame) | 是 | Continuous |
| ExposureTime | Integer | 曝光时间(微秒) | 是 | 10000 |
| Gain | Double | 增益值(dB) | 是 | 0.0 |
| FrameRate | Double | 帧率(FPS) | 是 | 30.0 |
| TriggerMode | String | 触发模式(Off, On) | 是 | Off |
### 3.3 ROI 部分
| 参数 | 类型 | 说明 | 是否必需 | 默认值 |
|-----|------|-----|--------|-------|
| Enable | Boolean | 是否启用ROI | 否 | false |
| OffsetX | Integer | ROI起始点X坐标 | 否 | 0 |
| OffsetY | Integer | ROI起始点Y坐标 | 否 | 0 |
| Width | Integer | ROI宽度 | 否 | 图像宽度 |
| Height | Integer | ROI高度 | 否 | 图像高度 |
### 3.4 Processing 部分
| 参数 | 类型 | 说明 | 是否必需 | 默认值 |
|-----|------|-----|--------|-------|
| EnableBinning | Boolean | 是否启用Binning | 否 | false |
| BinX | Integer | X方向Binning系数 | 否 | 1 |
| BinY | Integer | Y方向Binning系数 | 否 | 1 |
| EnableDecimation | Boolean | 是否启用Decimation | 否 | false |
| DecimationX | Integer | X方向Decimation系数 | 否 | 1 |
| DecimationY | Integer | Y方向Decimation系数 | 否 | 1 |
### 3.5 Advanced 部分
| 参数 | 类型 | 说明 | 是否必需 | 默认值 |
|-----|------|-----|--------|-------|
| BalanceRatioRed | Double | 红色通道平衡比例 | 否 | 1.0 |
| BalanceRatioGreen | Double | 绿色通道平衡比例 | 否 | 1.0 |
| BalanceRatioBlue | Double | 蓝色通道平衡比例 | 否 | 1.0 |
| Gamma | Double | 伽马校正系数 | 否 | 1.0 |
| BlackLevel | Integer | 黑电平值 | 否 | 0 |
| WhiteBalanceMode | String | 白平衡模式(Off, Continuous, Once) | 否 | Off |
| Sharpness | Double | 锐度调整值 | 否 | 0.0 |
### 3.6 Storage 部分
| 参数 | 类型 | 说明 | 是否必需 | 默认值 |
|-----|------|-----|--------|-------|
| SaveRawImages | Boolean | 是否保存原始图像 | 否 | false |
| SaveProcessedImages | Boolean | 是否保存处理后图像 | 否 | false |
| ImageSavePath | String | 图像保存路径 | 否 | Images |
| ImageFormat | String | 图像保存格式(PNG, JPG, BMP等) | 否 | PNG |
## 4. 配置示例
### 4.1 网络相机配置示例
```json
{
"CameraInfo": {
"CameraId": "CameraA",
"Model": "HIKVISION_MV-CA050-10GC",
"IpAddress": "192.168.1.10",
"Port": 8000,
"Manufacturer": "HIKVISION",
"FirmwareVersion": "V3.2.0"
},
"ImageSettings": {
"Width": 2592,
"Height": 2048,
"PixelFormat": "Mono8",
"AcquisitionMode": "Continuous",
"ExposureTime": 10000,
"Gain": 0.0,
"FrameRate": 25.0,
"TriggerMode": "Off"
},
"ROI": {
"Enable": false,
"OffsetX": 0,
"OffsetY": 0,
"Width": 2592,
"Height": 2048
},
"Processing": {
"EnableBinning": false,
"BinX": 1,
"BinY": 1,
"EnableDecimation": false,
"DecimationX": 1,
"DecimationY": 1
},
"Advanced": {
"BalanceRatioRed": 1.0,
"BalanceRatioGreen": 1.0,
"BalanceRatioBlue": 1.0,
"Gamma": 1.0,
"BlackLevel": 0,
"WhiteBalanceMode": "Off",
"Sharpness": 0.0
},
"Storage": {
"SaveRawImages": false,
"SaveProcessedImages": false,
"ImageSavePath": "Images",
"ImageFormat": "PNG"
}
}
```
### 4.2 带ROI的相机配置示例
```json
{
"CameraInfo": {
"CameraId": "CameraB",
"Model": "HIKVISION_MV-CA020-10GC",
"IpAddress": "192.168.1.11",
"Port": 8000,
"Manufacturer": "HIKVISION",
"FirmwareVersion": "V3.1.0"
},
"ImageSettings": {
"Width": 1920,
"Height": 1200,
"PixelFormat": "RGB8",
"AcquisitionMode": "Continuous",
"ExposureTime": 5000,
"Gain": 0.0,
"FrameRate": 30.0,
"TriggerMode": "On"
},
"ROI": {
"Enable": true,
"OffsetX": 500,
"OffsetY": 300,
"Width": 1000,
"Height": 800
},
"Processing": {
"EnableBinning": false,
"BinX": 1,
"BinY": 1,
"EnableDecimation": false,
"DecimationX": 1,
"DecimationY": 1
},
"Advanced": {
"BalanceRatioRed": 1.2,
"BalanceRatioGreen": 1.0,
"BalanceRatioBlue": 0.9,
"Gamma": 1.2,
"BlackLevel": 5,
"WhiteBalanceMode": "Continuous",
"Sharpness": 0.1
},
"Storage": {
"SaveRawImages": false,
"SaveProcessedImages": true,
"ImageSavePath": "Images/CameraB",
"ImageFormat": "JPG"
}
}
```
## 5. 配置文件管理
### 5.1 配置文件位置
相机配置文件存储在以下位置:
```
DeviceLibrary/
└── Config/
├── CameraA.json
├── CameraB.json
└── ...
```
### 5.2 配置加载流程
1. 系统启动时,`Camera.cs`类会扫描`Config`目录下的所有相机配置文件
2. 根据配置文件中的信息初始化相应的相机设备
3. 如果配置文件不存在或格式错误,系统将使用默认配置
### 5.3 配置修改方法
1. 直接编辑对应的JSON配置文件
2. 通过系统的配置界面进行修改(如果有)
3. 修改完成后,需要重启系统才能使新配置生效
## 6. 常见问题与解决方案
### 6.1 相机无法连接
- 检查IP地址和端口是否正确配置
- 确认相机与计算机在同一网络中
- 验证相机是否已正确供电并处于工作状态
### 6.2 图像质量问题
- 调整曝光时间和增益参数
- 对于彩色相机,检查白平衡设置
- 考虑启用ROI功能,只关注感兴趣的区域
### 6.3 帧率不达标
- 降低图像分辨率
- 启用Binning或Decimation功能
- 检查网络带宽是否足够(对于网络相机)
### 6.4 配置文件无效
- 确认JSON格式是否正确,可以使用在线JSON验证工具检查
- 检查必需参数是否都已配置
- 确保文件名与`CameraId`字段匹配
\ No newline at end of file
# 设备通信配置说明
## 1. 概述
本文档详细说明SISO系统中设备通信的配置方法,包括通信协议、配置文件格式、参数说明以及配置示例。设备通信配置对于系统各组件间的正常协作至关重要,用户应根据实际网络环境和设备情况正确配置相关参数。
## 2. 通信架构
SISO系统采用分层通信架构,主要包括以下几种通信方式:
- **控制器通信**:与运动控制器之间的通信
- **设备通信**:与各类传感器、执行器的通信
- **网络通信**:与上位机或其他系统的网络通信
- **内部通信**:系统内部模块间的进程通信
## 3. 通信协议配置
### 3.1 控制器通信配置
#### 3.1.1 EtherCAT通信配置
```xml
<?xml version="1.0" encoding="utf-8" ?>
<EtherCATConfig>
<Master>
<Id>1</Id>
<Name>ECAT_Master</Name>
<Port>1</Port>
<CycleTime>1000</CycleTime> <!-- 单位: μs -->
<Priority>High</Priority>
</Master>
<Slaves>
<Slave>
<Id>1</Id>
<Name>Servo_Drive_1</Name>
<VendorId>0x00000000</VendorId>
<ProductCode>0x00000000</ProductCode>
<Alias>0</Alias>
<Position>0</Position>
<Config>
<PdoMapping>
<TxPdo>
<Entry>StatusWord</Entry>
<Entry>ActualPosition</Entry>
<Entry>ActualVelocity</Entry>
<Entry>ActualTorque</Entry>
</TxPdo>
<RxPdo>
<Entry>ControlWord</Entry>
<Entry>TargetPosition</Entry>
<Entry>TargetVelocity</Entry>
<Entry>TargetTorque</Entry>
</RxPdo>
</PdoMapping>
<CycleTime>1000</CycleTime>
</Config>
</Slave>
<!-- 更多从站配置... -->
</Slaves>
</EtherCATConfig>
```
#### 3.1.2 Modbus RTU通信配置
```json
{
"ModbusRtuConfig": {
"Port": "COM3",
"BaudRate": 115200,
"DataBits": 8,
"StopBits": 1,
"Parity": "None",
"Timeout": 1000,
"Slaves": [
{
"Id": 1,
"Name": "TemperatureSensor",
"FunctionCode": 4,
"StartingRegister": 0,
"RegisterCount": 2
},
{
"Id": 2,
"Name": "PressureSensor",
"FunctionCode": 4,
"StartingRegister": 0,
"RegisterCount": 2
}
]
}
}
```
#### 3.1.3 Modbus TCP通信配置
```json
{
"ModbusTcpConfig": {
"IpAddress": "192.168.1.100",
"Port": 502,
"Timeout": 1000,
"Slaves": [
{
"Id": 1,
"Name": "PLC_Controller",
"FunctionCode": 3,
"StartingRegister": 100,
"RegisterCount": 10
}
]
}
}
```
### 3.2 网络通信配置
#### 3.2.1 TCP/IP服务器配置
```json
{
"TcpServerConfig": {
"Port": 8080,
"MaxConnections": 10,
"BufferSize": 4096,
"Timeout": 30000,
"EnableSsl": false,
"AutoReconnect": true
}
}
```
#### 3.2.2 TCP/IP客户端配置
```json
{
"TcpClientConfig": {
"IpAddress": "192.168.1.200",
"Port": 8080,
"BufferSize": 4096,
"Timeout": 30000,
"AutoReconnect": true,
"ReconnectInterval": 5000
}
}
```
#### 3.2.3 WebSocket配置
```json
{
"WebSocketConfig": {
"Port": 8081,
"Path": "/ws",
"MaxConnections": 50,
"EnableSsl": false,
"HeartbeatInterval": 30000
}
}
```
## 4. 设备通信配置参数说明
### 4.1 EtherCAT配置参数
| 参数 | 类型 | 说明 | 是否必需 |
|-----|------|-----|--------|
| 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 配置文件位置
配置文件通常存储在以下位置:
- 主配置目录: `/Config/Communication/`
- EtherCAT配置: `/Config/Communication/EtherCAT.xml`
- Modbus配置: `/Config/Communication/Modbus.json`
- 网络通信配置: `/Config/Communication/Network.json`
### 5.2 配置文件加载流程
1. 系统启动时,自动加载通信配置文件
2. 验证配置文件格式和参数有效性
3. 根据配置初始化通信模块
4. 建立与各设备的通信连接
5. 监控通信状态,处理异常情况
### 5.3 动态配置更新
系统支持运行时动态更新通信配置:
- 通过API接口更新配置
- 通过Web界面更新配置
- 配置更新后自动重新连接设备
## 6. 通信诊断与故障排除
### 6.1 通信状态监控
系统提供通信状态监控功能:
- 连接状态
- 数据传输率
- 错误率
- 延迟时间
### 6.2 常见通信问题及解决方案
#### 6.2.1 EtherCAT通信问题
| 问题 | 可能原因 | 解决方案 |
|-----|---------|--------|
| 从站无法连接 | 网络连接故障 | 检查网线连接和网络适配器设置 |
| 通信周期性中断 | 网络干扰 | 检查接地、使用屏蔽线缆、调整周期时间 |
| 数据传输错误 | PDO映射错误 | 重新配置PDO映射,确保与从站设备匹配 |
#### 6.2.2 Modbus通信问题
| 问题 | 可能原因 | 解决方案 |
|-----|---------|--------|
| 无法建立连接 | 串口参数不匹配 | 确认波特率、数据位、停止位和校验位设置正确 |
| 超时错误 | 从站响应缓慢 | 增加超时时间,检查从站设备状态 |
| 数据错误 | 寄存器地址错误 | 确认从站设备的寄存器映射关系 |
#### 6.2.3 网络通信问题
| 问题 | 可能原因 | 解决方案 |
|-----|---------|--------|
| 连接被拒绝 | 目标设备未运行或防火墙阻止 | 确认目标设备运行状态和防火墙设置 |
| 连接断开 | 网络不稳定 | 检查网络设备,启用自动重连功能 |
| 数据传输缓慢 | 网络拥塞 | 增加缓冲区大小,优化数据传输策略 |
## 7. 通信性能优化建议
### 7.1 实时通信优化
- 使用高优先级进程
- 减少非必要的系统服务
- 优化操作系统设置,提高实时性能
- 使用专用网卡进行实时通信
### 7.2 数据传输优化
- 减少传输数据量
- 合理设置通信周期
- 采用高效的数据压缩算法
- 使用批量传输代替频繁小数据传输
### 7.3 网络优化
- 使用交换机而非集线器
- 隔离实时通信网络
- 减少网络中的设备数量
- 避免网络拓扑复杂度过高
\ No newline at end of file
# 系统故障排除指南
## 1. 概述
本文档提供了SISO系统常见故障的诊断步骤和解决方案,旨在帮助技术人员快速识别和解决系统运行中遇到的问题。故障排除应遵循系统化的方法,从基础检查开始,逐步深入分析,最终解决问题。
## 2. 故障诊断基本流程
### 2.1 故障诊断四步法
1. **问题识别**:明确故障现象、发生时间、频率及影响范围
2. **信息收集**:收集系统日志、错误代码、设备状态等信息
3. **分析判断**:根据收集的信息,分析可能的故障原因
4. **解决验证**:实施解决方案并验证结果
### 2.2 常用诊断工具
- 系统日志查看器
- 设备状态监控面板
- 通信诊断工具
- 硬件诊断工具
- 网络测试工具
## 3. 硬件故障排除
### 3.1 轴运动故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 轴无法移动 | 伺服未使能 | 1. 检查伺服使能信号<br>2. 检查伺服电源<br>3. 检查伺服报警状态 | 1. 确认IO映射正确<br>2. 重启伺服驱动器<br>3. 清除报警 |
| 轴移动精度差 | 编码器问题 | 1. 检查编码器连接<br>2. 检查编码器参数设置<br>3. 检查机械系统 | 1. 重新连接编码器<br>2. 调整编码器参数<br>3. 维修或更换机械部件 |
| 轴移动异常声音 | 机械故障 | 1. 检查机械部件<br>2. 检查润滑状态<br>3. 检查负载情况 | 1. 调整或更换机械部件<br>2. 补充润滑<br>3. 减小负载或调整速度参数 |
| 轴定位不准确 | 校准问题 | 1. 执行回零操作<br>2. 检查回零参数<br>3. 检查限位传感器 | 1. 重新校准<br>2. 调整回零参数<br>3. 检查并调整传感器位置 |
### 3.2 IO设备故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 输入信号无响应 | 传感器故障 | 1. 检查传感器电源<br>2. 检查传感器连接<br>3. 检查传感器状态指示 | 1. 更换传感器<br>2. 重新连接<br>3. 检查电源 |
| 输出信号无效 | 执行器故障 | 1. 检查执行器电源<br>2. 检查执行器连接<br>3. 测试执行器功能 | 1. 更换执行器<br>2. 重新连接<br>3. 检查电源 |
| IO点信号不稳定 | 干扰或接线问题 | 1. 检查接线端子<br>2. 检查屏蔽接地<br>3. 检查信号干扰源 | 1. 重新接线<br>2. 确保良好接地<br>3. 隔离干扰源 |
### 3.3 传感器故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 传感器无读数 | 电源或连接问题 | 1. 检查传感器电源<br>2. 检查传感器连接<br>3. 检查传感器配置 | 1. 修复电源问题<br>2. 重新连接<br>3. 重新配置 |
| 传感器读数不准确 | 校准问题 | 1. 执行传感器校准<br>2. 检查校准参数<br>3. 检查环境因素 | 1. 重新校准<br>2. 调整参数<br>3. 改善环境条件 |
| 传感器读数波动大 | 信号干扰 | 1. 检查屏蔽接地<br>2. 检查信号线路<br>3. 检查电源稳定性 | 1. 确保良好接地<br>2. 使用屏蔽线缆<br>3. 增加信号滤波 |
## 4. 通信故障排除
### 4.1 EtherCAT通信故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 从站无法连接 | 网络连接问题 | 1. 检查网线连接<br>2. 检查网络适配器<br>3. 检查从站电源 | 1. 更换网线<br>2. 检查网络设置<br>3. 确保从站正常供电 |
| 通信周期性中断 | 配置或干扰问题 | 1. 检查通信周期设置<br>2. 检查网络拓扑<br>3. 检查接地情况 | 1. 调整通信周期<br>2. 简化网络拓扑<br>3. 改进接地系统 |
| 数据传输错误 | PDO映射或参数问题 | 1. 检查PDO映射<br>2. 检查从站参数<br>3. 检查主站配置 | 1. 重新配置PDO<br>2. 调整从站参数<br>3. 检查并修复主站配置 |
### 4.2 网络通信故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 连接超时 | 网络或配置问题 | 1. 检查网络连接<br>2. 检查IP配置<br>3. 检查防火墙设置 | 1. 修复网络连接<br>2. 确认IP设置正确<br>3. 调整防火墙规则 |
| 数据传输错误 | 协议或参数问题 | 1. 检查协议设置<br>2. 检查缓冲区设置<br>3. 检查数据格式 | 1. 确认协议匹配<br>2. 调整缓冲区大小<br>3. 验证数据格式 |
| 连接不稳定 | 网络或硬件问题 | 1. 检查网络质量<br>2. 检查网络设备<br>3. 检查线缆连接 | 1. 优化网络环境<br>2. 更新网络设备固件<br>3. 重新连接线缆 |
## 5. 软件故障排除
### 5.1 系统启动故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 系统无法启动 | 配置或依赖问题 | 1. 检查系统配置文件<br>2. 检查依赖组件<br>3. 查看启动日志 | 1. 修复配置文件<br>2. 安装缺失依赖<br>3. 分析并解决日志中的错误 |
| 启动过程中报错 | 初始化或资源问题 | 1. 检查初始化顺序<br>2. 检查资源分配<br>3. 检查硬件连接 | 1. 调整初始化顺序<br>2. 增加可用资源<br>3. 确认硬件连接正确 |
| 服务无法启动 | 权限或配置问题 | 1. 检查服务配置<br>2. 检查用户权限<br>3. 检查端口占用 | 1. 修复服务配置<br>2. 调整用户权限<br>3. 释放占用端口 |
### 5.2 功能模块故障
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 特定功能无法使用 | 模块未加载或配置错误 | 1. 检查模块加载状态<br>2. 检查模块配置<br>3. 检查依赖关系 | 1. 重新加载模块<br>2. 修复模块配置<br>3. 解决依赖问题 |
| 功能执行异常 | 逻辑或参数问题 | 1. 检查功能逻辑<br>2. 检查参数设置<br>3. 检查输入数据 | 1. 修复逻辑错误<br>2. 调整参数值<br>3. 验证输入数据有效性 |
| 功能执行超时 | 性能或资源问题 | 1. 检查系统负载<br>2. 检查资源分配<br>3. 检查执行逻辑 | 1. 减轻系统负载<br>2. 优化资源使用<br>3. 改进执行算法 |
### 5.3 配置错误
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 参数设置无效 | 配置文件错误 | 1. 检查配置文件格式<br>2. 检查参数值范围<br>3. 检查默认值 | 1. 修复配置文件<br>2. 调整参数值到有效范围<br>3. 重置为默认配置 |
| 配置未生效 | 缓存或权限问题 | 1. 检查配置缓存<br>2. 检查文件权限<br>3. 检查配置加载流程 | 1. 清除配置缓存<br>2. 修复文件权限<br>3. 重启配置服务 |
## 6. 系统性能问题
### 6.1 响应缓慢
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 系统响应慢 | 资源不足或配置问题 | 1. 检查CPU使用率<br>2. 检查内存使用<br>3. 检查磁盘空间 | 1. 关闭不必要进程<br>2. 增加系统内存<br>3. 清理磁盘空间 |
| 操作执行延迟 | 算法或通信问题 | 1. 检查执行算法<br>2. 检查通信延迟<br>3. 检查任务调度 | 1. 优化算法<br>2. 提高通信优先级<br>3. 调整任务调度策略 |
### 6.2 内存问题
| 故障现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---------|---------|---------|--------|
| 内存泄漏 | 资源未释放 | 1. 监控内存使用趋势<br>2. 分析进程内存分配<br>3. 检查资源释放代码 | 1. 修复资源释放逻辑<br>2. 增加内存监控<br>3. 定期重启关键服务 |
| 内存溢出 | 分配过多或泄漏 | 1. 检查内存分配请求<br>2. 检查内存使用模式<br>3. 检查错误日志 | 1. 优化内存使用<br>2. 增加虚拟内存<br>3. 修复内存分配错误 |
## 7. 日志分析指南
### 7.1 日志级别说明
| 级别 | 说明 | 示例 |
|-----|------|------|
| FATAL | 致命错误,导致系统崩溃 | 硬件故障、核心服务崩溃 |
| ERROR | 严重错误,影响系统功能 | 通信失败、设备连接断开 |
| WARN | 警告信息,可能导致问题 | 参数异常、资源不足 |
| INFO | 一般信息,记录重要事件 | 系统启动、模块加载 |
| DEBUG | 调试信息,用于问题诊断 | 函数调用、变量值 |
| TRACE | 详细跟踪信息,记录执行流程 | 代码路径、执行步骤 |
### 7.2 日志文件位置
- 系统日志: `/Logs/System/`
- 应用日志: `/Logs/Application/`
- 通信日志: `/Logs/Communication/`
- 设备日志: `/Logs/Device/`
- 错误日志: `/Logs/Error/`
### 7.3 关键错误代码含义
#### 7.3.1 通信错误代码
| 错误代码 | 说明 | 可能原因 |
|---------|------|--------|
| ECOM001 | 连接失败 | 网络问题、目标不可达 |
| ECOM002 | 超时错误 | 响应缓慢、网络延迟 |
| ECOM003 | 数据传输错误 | 协议不匹配、数据损坏 |
| ECOM004 | 配置错误 | 参数设置不正确、配置文件损坏 |
#### 7.3.2 设备错误代码
| 错误代码 | 说明 | 可能原因 |
|---------|------|--------|
| EDEV001 | 设备未连接 | 电源问题、物理连接断开 |
| EDEV002 | 设备响应错误 | 设备故障、参数错误 |
| EDEV003 | 设备超时 | 通信问题、设备繁忙 |
| EDEV004 | 设备异常 | 内部错误、硬件故障 |
#### 7.3.3 系统错误代码
| 错误代码 | 说明 | 可能原因 |
|---------|------|--------|
| ESYS001 | 初始化失败 | 配置错误、依赖缺失 |
| ESYS002 | 资源不足 | 内存不足、CPU过载 |
| ESYS003 | 访问权限错误 | 权限设置问题、用户权限不足 |
| ESYS004 | 文件操作错误 | 文件不存在、权限问题、磁盘空间不足 |
## 8. 预防性维护
### 8.1 日常维护检查项目
- 检查硬件连接是否牢固
- 检查设备电源状态
- 检查系统温度和散热情况
- 检查日志中的警告信息
- 备份关键配置和数据
### 8.2 定期维护项目
| 维护项目 | 周期 | 操作内容 |
|---------|------|--------|
| 机械部件检查 | 每周 | 检查机械连接、润滑状态、磨损情况 |
| 电气系统检查 | 每月 | 检查接线端子、绝缘状态、接地情况 |
| 系统备份 | 每周 | 备份配置文件、日志数据 |
| 固件更新 | 季度 | 检查并更新设备固件、系统补丁 |
| 性能评估 | 月度 | 分析系统性能、优化参数设置 |
### 8.3 维护记录管理
建立维护记录系统,记录以下信息:
- 维护日期和时间
- 维护内容和范围
- 发现的问题和解决措施
- 更换的部件信息
- 性能参数变化
## 9. 故障报告模板
在需要向技术支持报告问题时,请使用以下模板提供详细信息:
```
# 故障报告
## 基本信息
- 报告日期:YYYY-MM-DD
- 系统版本:X.X.X
- 硬件配置:[详细配置信息]
- 问题发现人:[姓名]
## 故障描述
[详细描述故障现象、发生时间、频率和影响范围]
## 故障重现步骤
1. [步骤1]
2. [步骤2]
3. [步骤3]
## 已尝试的解决方案
[列出已尝试过的解决方法及结果]
## 日志信息
[附上相关的日志文件或关键日志片段]
## 错误代码
[记录系统显示的错误代码和消息]
## 设备状态
[描述故障发生时的设备状态]
## 网络环境
[描述当前网络配置和状态]
```
## 10. 附录:常见配置文件路径
| 配置项 | 文件路径 |
|-------|--------|
| 系统配置 | /Config/System.config |
| 通信配置 | /Config/Communication.config |
| 设备配置 | /Config/Devices.config |
| 轴配置 | /Config/Axes.xml |
| 日志配置 | /Config/Logging.config |
| 日志文件 | 文件路径 |
|---------|--------|
| 系统日志 | /Logs/System.log |
| 应用日志 | /Logs/Application.log |
| 错误日志 | /Logs/Error.log |
| 通信日志 | /Logs/Communication.log |
| 调试日志 | /Logs/Debug.log |
\ No newline at end of file
# SISO系统用户手册
## 1. 简介
### 1.1 文档目的
本文档旨在为SISO系统的操作人员提供全面的操作指南,包括系统概述、安装配置、日常操作、维护保养及故障处理等内容,帮助用户正确、安全、高效地使用本系统。
### 1.2 适用对象
- 系统操作人员
- 维护技术人员
- 系统管理员
- 技术支持人员
### 1.3 术语解释
| 术语 | 解释说明 |
|-----|--------|
| SISO | Single Input Single Output,单输入单输出系统 |
| PLC | Programmable Logic Controller,可编程逻辑控制器 |
| HMI | Human Machine Interface,人机界面 |
| EtherCAT | 工业以太网通信协议 |
| Modbus | 工业通信协议 |
| 伺服 | 伺服电机,高精度运动控制设备 |
| IO | Input/Output,输入/输出设备 |
| 回零 | 运动轴回到参考点位置的操作 |
| 点位运动 | 从当前位置移动到目标位置的运动方式 |
| 连续轨迹 | 按预定路径连续运动的方式 |
## 2. 系统概述
### 2.1 系统功能
SISO系统是一个集运动控制、设备管理、数据采集和监控于一体的工业自动化控制系统,主要功能包括:
- 多轴运动控制
- 设备IO管理
- 传感器数据采集
- 系统状态监控
- 数据记录与分析
- 故障诊断与报警
- 远程通信与控制
### 2.2 系统架构
系统采用分层架构设计,主要包括以下层级:
- **设备层**:各种硬件设备,如伺服电机、传感器、执行器等
- **控制层**:运动控制器、IO控制器等
- **通信层**:各种通信模块和协议处理
- **应用层**:业务逻辑和功能模块
- **展示层**:用户界面和数据展示
### 2.3 主要组件
- **主控制器**:系统核心控制单元
- **运动控制模块**:负责轴运动控制
- **IO控制模块**:管理输入输出信号
- **传感器模块**:采集各类传感器数据
- **通信模块**:处理各种通信协议
- **HMI界面**:人机交互界面
- **日志系统**:记录系统运行日志
## 3. 系统安装与配置
### 3.1 硬件安装
#### 3.1.1 安装环境要求
- 环境温度:0°C ~ 45°C
- 相对湿度:10% ~ 90%(无凝露)
- 振动:≤0.5g
- 电源:AC 220V ±10%,50Hz/60Hz
- 接地电阻:≤1Ω
#### 3.1.2 安装步骤
1. 检查包装完整性,确认所有组件齐全
2. 安装控制器到合适的机架或控制柜中
3. 连接电源线路,确保接线正确
4. 连接各设备通信线缆
5. 连接传感器和执行器
6. 安装冷却风扇和通风设备(如需要)
#### 3.1.3 接线注意事项
- 严格按照接线图进行接线
- 动力线和信号线分开布线,避免干扰
- 所有连接必须牢固可靠
- 确保正确接地,避免静电和干扰
- 检查绝缘性能,避免短路
### 3.2 软件安装
#### 3.2.1 系统要求
- 操作系统:Windows 10/11 64位
- CPU:Intel i5 或同等性能处理器
- 内存:8GB 或以上
- 硬盘:SSD 256GB 或以上
- 显卡:支持DirectX 11
- 网络:千兆以太网接口
#### 3.2.2 安装步骤
1. 运行安装程序 Setup.exe
2. 按照安装向导提示,选择安装语言和目标路径
3. 选择需要安装的组件
4. 等待安装完成
5. 安装完成后,重启计算机
#### 3.2.3 驱动安装
1. 安装运动控制卡驱动
2. 安装网卡驱动(如需特殊配置)
3. 安装其他硬件设备驱动
### 3.3 系统配置
#### 3.3.1 基本配置
1. 启动系统配置工具
2. 设置系统基本信息(名称、编号等)
3. 配置网络参数(IP地址、子网掩码等)
4. 设置用户权限和密码
5. 保存配置并重启系统
#### 3.3.2 轴配置
1. 进入轴配置界面
2. 添加或编辑轴参数
3. 设置机械参数(行程、单位等)
4. 设置运动参数(速度、加速度等)
5. 配置限位和回零参数
6. 保存配置
#### 3.3.3 IO配置
1. 进入IO配置界面
2. 配置输入点参数(类型、信号等)
3. 配置输出点参数(类型、控制方式等)
4. 配置IO映射关系
5. 保存配置
#### 3.3.4 通信配置
1. 进入通信配置界面
2. 设置通信协议参数
3. 配置设备连接信息
4. 测试通信连接
5. 保存配置
## 4. 系统启动与关机
### 4.1 系统启动
#### 4.1.1 启动前检查
1. 检查电源连接是否正确
2. 检查各设备连接是否牢固
3. 确认急停按钮处于正常状态
4. 检查环境条件是否符合要求
#### 4.1.2 启动步骤
1. 闭合主电源开关
2. 等待系统初始化完成
3. 输入用户名和密码登录系统
4. 检查系统状态页面,确认各设备正常
5. 执行必要的初始化操作(如轴回零)
#### 4.1.3 启动顺序
1. 先启动电源系统
2. 启动主控制器
3. 启动各控制模块
4. 启动HMI系统
5. 启动通信系统
### 4.2 系统关机
#### 4.2.1 正常关机步骤
1. 确保所有正在执行的任务已完成或中止
2. 将各轴移动到安全位置
3. 通过HMI界面执行系统停止操作
4. 退出用户登录
5. 执行系统关机命令
6. 等待系统完全关闭后,断开电源
#### 4.2.2 紧急关机
在遇到紧急情况时:
1. 立即按下急停按钮
2. 断开主电源开关
3. 处理紧急情况
4. 检查系统状态,确认安全后才能重新启动
## 5. 系统操作界面
### 5.1 主界面介绍
主界面是系统的核心操作区域,主要包括以下部分:
- **菜单栏**:包含系统功能菜单
- **工具栏**:常用操作按钮
- **状态栏**:显示系统当前状态
- **导航面板**:快速访问各功能模块
- **主显示区**:显示当前功能模块内容
### 5.2 功能模块界面
#### 5.2.1 轴控制界面
轴控制界面用于监控和控制各运动轴,主要功能包括:
- 显示各轴实时位置、速度和状态
- 控制轴的运动(点动、定位等)
- 执行回零操作
- 设置运动参数
- 监控限位状态
#### 5.2.2 IO监控界面
IO监控界面用于监控和控制输入输出信号,主要功能包括:
- 实时显示IO点状态
- 手动控制输出点
- 设置IO点属性
- 监控信号变化记录
#### 5.2.3 系统状态界面
系统状态界面显示系统整体运行状态,包括:
- 各模块运行状态
- 通信连接状态
- 错误和报警信息
- 资源使用情况
#### 5.2.4 数据监控界面
数据监控界面用于实时监控各类数据,主要功能包括:
- 实时数据图表显示
- 历史数据查询
- 数据导出
- 趋势分析
#### 5.2.5 参数设置界面
参数设置界面用于配置系统各项参数,包括:
- 运动参数设置
- IO参数设置
- 通信参数设置
- 用户权限设置
- 系统配置设置
## 6. 基本操作
### 6.1 轴运动控制
#### 6.1.1 点动操作
1. 进入轴控制界面
2. 选择需要操作的轴
3. 选择点动模式(正向/负向)
4. 设置点动速度
5. 点击点动按钮或按住键盘方向键执行点动
6. 释放按钮或键盘键停止点动
#### 6.1.2 绝对定位
1. 进入轴控制界面
2. 选择需要定位的轴
3. 选择绝对定位模式
4. 输入目标位置值
5. 设置运动速度
6. 点击"开始"按钮执行定位
7. 等待定位完成
#### 6.1.3 相对定位
1. 进入轴控制界面
2. 选择需要定位的轴
3. 选择相对定位模式
4. 输入位移量
5. 设置运动速度
6. 点击"开始"按钮执行定位
7. 等待定位完成
#### 6.1.4 回零操作
1. 进入轴控制界面
2. 选择需要回零的轴
3. 点击"回零"按钮
4. 等待回零完成
5. 确认回零指示灯点亮
### 6.2 IO控制
#### 6.2.1 手动控制输出点
1. 进入IO监控界面
2. 找到需要控制的输出点
3. 点击相应的控制按钮切换状态
4. 观察输出点状态变化
#### 6.2.2 监控输入点
1. 进入IO监控界面
2. 观察输入点状态实时显示
3. 可选择记录输入点状态变化
### 6.3 程序控制
#### 6.3.1 加载程序
1. 进入程序管理界面
2. 选择需要加载的程序
3. 点击"加载"按钮
4. 等待程序加载完成
#### 6.3.2 运行程序
1. 确保程序已正确加载
2. 检查系统状态是否允许运行
3. 点击"运行"按钮开始程序执行
4. 观察程序执行状态
#### 6.3.3 暂停程序
1. 程序执行过程中
2. 点击"暂停"按钮
3. 程序将暂停在当前位置
#### 6.3.4 停止程序
1. 程序执行过程中
2. 点击"停止"按钮
3. 程序将停止执行
### 6.4 数据记录与查询
#### 6.4.1 启动数据记录
1. 进入数据记录界面
2. 选择需要记录的数据项
3. 设置记录周期
4. 点击"开始记录"按钮
#### 6.4.2 查询历史数据
1. 进入数据查询界面
2. 设置查询条件(时间范围、数据类型等)
3. 点击"查询"按钮
4. 查看查询结果
5. 可选择导出数据
## 7. 系统维护
### 7.1 日常维护
#### 7.1.1 每日维护项目
1. 检查系统运行状态
2. 清理设备表面灰尘
3. 检查冷却系统是否正常
4. 查看报警日志
5. 备份必要数据
#### 7.1.2 每周维护项目
1. 检查接线端子是否松动
2. 检查各设备指示灯状态
3. 测试急停功能
4. 清理散热风扇灰尘
5. 检查接地系统
#### 7.1.3 每月维护项目
1. 检查电源电压稳定性
2. 检查通信线路绝缘情况
3. 测试备份恢复功能
4. 检查并更新系统补丁
5. 清理日志文件
### 7.2 定期校准
#### 7.2.1 传感器校准
1. 按照传感器说明书要求准备校准工具
2. 进入校准界面
3. 按照校准向导进行操作
4. 保存校准数据
#### 7.2.2 轴运动精度校准
1. 准备精度测量工具
2. 将轴移动到多个参考位置
3. 测量实际位置与理论位置的偏差
4. 进入校准界面输入补偿值
5. 保存校准数据
### 7.3 常见故障处理
#### 7.3.1 通信故障
1. 检查网络连接
2. 重启通信模块
3. 检查通信参数设置
4. 确认目标设备正常工作
#### 7.3.2 轴运动异常
1. 检查轴是否有机械阻碍
2. 检查伺服驱动器状态
3. 检查编码器连接
4. 尝试重新回零
#### 7.3.3 IO信号异常
1. 检查信号接线
2. 检查传感器电源
3. 检查执行器状态
4. 重新配置IO参数
## 8. 安全操作
### 8.1 安全注意事项
1. 系统运行时,禁止靠近运动部件
2. 操作前必须熟悉系统功能和安全规程
3. 维护时必须切断电源并悬挂警告标识
4. 定期检查急停按钮和安全防护装置
5. 禁止擅自修改系统安全参数
### 8.2 紧急情况处理
1. **发生碰撞**:立即按下急停按钮,切断电源,检查设备损坏情况
2. **设备异常**:立即停止操作,记录异常现象,联系技术人员处理
3. **人身伤害**:立即停止设备,切断电源,进行紧急救援并联系医疗人员
### 8.3 权限管理
1. 严格按照职责分配用户权限
2. 定期更改密码
3. 禁止使用他人账户登录
4. 系统管理员定期审计用户操作日志
## 9. 故障诊断与报警
### 9.1 报警系统概述
系统报警系统用于监测和报告各类异常情况,包括:
- 设备故障报警
- 参数越限报警
- 操作错误报警
- 系统异常报警
### 9.2 报警等级
报警分为多个等级,从低到高依次为:
- **提示**:一般信息提示,不影响系统运行
- **警告**:需要注意的异常情况,可能影响系统性能
- **错误**:系统出现错误,需要及时处理
- **严重**:严重错误,可能影响系统安全运行
- **致命**:致命错误,系统无法继续运行
### 9.3 报警处理流程
1. 收到报警信息后,立即查看报警详情
2. 根据报警说明和解决建议采取相应措施
3. 处理完成后,确认报警是否消除
4. 记录报警原因和处理方法
### 9.4 常见报警及处理
| 报警代码 | 报警描述 | 可能原因 | 处理方法 |
|---------|--------|---------|--------|
| ALM001 | 轴位置超限 | 限位开关触发或软限位设置不当 | 检查机械位置,调整限位设置 |
| ALM002 | 伺服驱动器报警 | 伺服故障或参数设置错误 | 检查伺服驱动器报警代码,参考伺服手册处理 |
| ALM003 | 通信超时 | 网络故障或设备无响应 | 检查网络连接,重启通信设备 |
| ALM004 | 电源电压异常 | 电源波动或故障 | 检查电源系统,必要时更换电源 |
| ALM005 | 温度过高 | 环境温度过高或冷却系统故障 | 改善通风条件,检查冷却系统 |
## 10. 附录
### 10.1 技术参数
#### 10.1.1 系统参数
- 电源要求:AC 220V ±10%,50/60Hz
- 功耗:最大300W
- 工作温度:0°C ~ 45°C
- 存储温度:-20°C ~ 60°C
- 相对湿度:10% ~ 90%(无凝露)
- 防护等级:IP20(控制箱内安装)
#### 10.1.2 运动控制参数
- 控制轴数:最大8轴
- 位置控制精度:±0.01mm
- 速度范围:0.01 ~ 1000mm/s
- 加速度范围:0.1 ~ 1000mm/s²
- 插补功能:线性、圆弧、螺旋线
#### 10.1.3 IO参数
- 数字输入:最大64点
- 数字输出:最大64点
- 模拟输入:最大16通道,16位精度
- 模拟输出:最大8通道,16位精度
### 10.2 常用快捷键
| 快捷键 | 功能描述 |
|-------|--------|
| F1 | 打开帮助文档 |
| F2 | 切换轴控制界面 |
| F3 | 切换IO监控界面 |
| F4 | 切换系统状态界面 |
| F5 | 刷新当前界面 |
| Ctrl+S | 保存当前设置 |
| Ctrl+O | 打开文件 |
| Ctrl+P | 打印当前内容 |
| Esc | 取消当前操作 |
### 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
此文件类型无法预览
此文件类型无法预览
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 6D 67 44 4D 43 53 2C 1D 63 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 04 FE 01 03 FD 01 23 BC 1E 2B 1C 64 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 00 FF 00 00 FF 00 00 FF 00 21 BA 1F 29 19 65 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 33 8E 33 29 19 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 02 FE 00 2F 91 31 26 15 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 18 BF 1D 25 14 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 31 A5 28 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 1B B8 1F 27 16 66 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 2F 20 62 33 A8 27 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 1A C1 1C 28 18 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1D 0C 6B 32 24 61 37 AC 25 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 32 93 30 29 19 65 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1E 0D 6A 34 26 60 38 AD 25 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 03 FD 01 35 8F 31 2A 1A 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1F 0E 6A 34 26 60 35 AA 26 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 03 FD 01 34 8F 32 28 18 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 30 21 62 31 A4 28 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 03 FD 01 34 8F 32 29 19 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2D 1E 63 30 A4 28 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 03 FD 01 33 8C 33 27 17 66 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2E 1F 63 19 CE 16 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 02 FE 01 4A 3F 55 25 14 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0C 6B 2D 1E 63 1A CF 15 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 21 E2 0D 42 36 59 22 11 69 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2D 1E 63 30 A8 27 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 1F DF 0E 41 35 59 22 11 69 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2F 20 62 60 61 47 07 FC 01 00 FF 00 00 FF 00 00 FF 00 00 FF 00 30 CB 17 3F 33 5A 22 12 68 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0C 6B 34 26 60 6B 6E 41 08 FD 01 00 FF 00 00 FF 00 00 FF 00 00 FF 00 1F DF 0E 40 34 5A 22 12 68 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 20 0F 6A 3D 30 5B 77 7C 3B 07 FD 01 00 FF 00 00 FF 00 00 FF 00 00 FF 00 31 CB 17 3A 2D 5D 1E 0D 6A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 22 11 69 3F 33 5A 73 80 39 01 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 2A C3 1A 31 23 61 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 22 12 68 3E 31 5B 40 B6 21 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 25 BE 1D 2C 1D 63 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 21 10 69 3D 30 5B 42 B8 20 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 23 BC 1E 2D 1E 63 1D 0C 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 21 10 69 43 37 58 4B C3 1C 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 24 BC 1D 2B 1B 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 27 17 66 50 46 52 43 D3 14 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 23 BC 1E 2B 1C 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 29 19 65 52 53 4D 05 FC 01 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 38 93 30 2B 1C 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2A 1A 65 2D A0 2A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 01 FF 00 25 BF 1D 31 23 61 1E 0D 6A 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2C 1D 63 2E A1 2A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 28 C1 1B 34 26 60 20 0F 6A 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2B 1B 64 2C A0 2A 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 43 A0 2A 39 2B 5D 1F 0E 6A AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2A 1A 65 50 50 4D 2A E1 0E 00 FF 00 00 FF 00 00 FF 00 00 FF 00 02 FF 00 45 A2 29 38 2A 5E AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 28 18 65 4B 49 50 35 D4 13 00 FF 00 00 FF 00 00 FF 00 00 FF 00 01 FF 00 2C C6 1A AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 27 17 66 49 3E 55 46 C1 1C 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 24 13 68 47 3C 56 46 C1 1C 00 FF 00 00 FF 00 00 FF 00 00 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 25 14 67 45 3A 57 47 BF 1D 00 FF 00 00 FF 00 00 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 25 14 67 43 38 58 02 FD 01 00 FF 00 00 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 23 13 68 22 94 2F 00 FF 00 00 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 6D 67 44 4D 43 53 2C 1D 63 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A C4 CC 18 9A 9C 2D 5A 51 4D 2B 1C 64 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A E6 F4 07 D5 E0 10 A0 A2 2A 55 4D 4F 29 19 65 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A E7 F5 07 E7 F5 07 D5 E0 10 9B 9E 2C 52 49 51 29 19 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A D6 E1 0F E8 F6 06 E9 F7 06 D5 E0 10 9A 9C 2D 50 46 52 26 15 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A A3 A6 29 D8 E3 0F E8 F6 06 EA F8 06 D1 DC 12 90 90 32 48 3D 56 25 14 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 5D 55 4B A5 A9 27 D8 E4 0E EA F8 06 E6 F3 08 CA D4 15 8B 8B 35 49 3E 55 27 16 66 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 2F 20 62 61 5A 49 AA AF 25 DD EA 0C EB F9 05 E6 F3 08 CD D7 14 91 91 32 4E 44 53 28 18 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1D 0C 6B 32 24 61 68 63 46 B2 B7 21 DF EC 0B EB FA 05 E8 F6 06 D1 DC 12 99 9B 2E 54 4B 50 29 19 65 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1E 0D 6A 34 26 60 6A 64 45 B3 B9 21 DE EB 0B EA F8 06 E8 F6 06 D5 E0 10 9C 9F 2C 55 4C 4F 2A 1A 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1F 0E 6A 34 26 60 65 5F 47 A9 AD 26 D9 E5 0E E9 F7 06 E8 F6 06 D6 E1 0F 9D A0 2C 54 4B 50 28 18 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 30 21 62 5C 54 4C A4 A7 28 D8 E3 0F E7 F5 07 EA F8 06 D3 DE 11 9B 9E 2C 54 4B 50 29 19 65 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2D 1E 63 5B 53 4C A2 A5 29 D5 E0 10 E7 F5 07 E7 F5 07 D3 DE 11 9A 9C 2D 51 47 51 27 17 66 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2E 1F 63 5A 52 4D A2 A5 29 D8 E3 0F E9 F7 06 E8 F6 06 D3 DE 11 93 94 30 4A 3F 55 25 14 67 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0C 6B 2D 1E 63 5C 54 4C A5 A8 28 D8 E4 0E E9 F7 06 E7 F5 07 CC D6 14 88 87 36 42 36 59 22 11 69 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2D 1E 63 5D 55 4B A8 AC 26 DD EA 0C EB FA 05 E5 F2 08 C4 CC 18 7E 7B 3B 41 35 59 22 11 69 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2F 20 62 63 5C 49 B2 B7 21 E1 EE 0A EA F8 06 E3 F1 09 C0 C8 1A 7C 79 3C 3F 33 5A 22 12 68 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0C 6B 34 26 60 6E 69 43 BC C4 1C E1 EF 0A E9 F7 06 E1 EF 0A C1 C9 1A 7F 7C 3B 40 34 5A 22 12 68 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 20 0F 6A 3D 30 5B 7B 78 3D C0 C8 1A E2 F0 09 E8 F6 06 E2 F0 09 C3 CB 19 7D 7A 3B 3A 2D 5D 1E 0D 6A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 22 11 69 3F 33 5A 7B 78 3D BD C5 1C E0 ED 0B EA F8 06 E5 F2 08 BD C5 1C 6B 65 44 31 23 61 1C 0A 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 22 12 68 3E 31 5B 78 75 3E BC C4 1C E2 F0 09 EB FA 05 E0 ED 0B AD B2 24 5E 56 4B 2C 1D 63 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 21 10 69 3D 30 5B 7C 79 3C C6 CF 17 E6 F4 07 EA F8 06 D9 E5 0E A4 A7 28 5A 52 4D 2D 1E 63 1D 0C 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 21 10 69 43 37 58 8D 8D 34 D0 DB 12 E8 F6 06 E9 F7 06 D8 E3 0F A1 A4 2A 5B 53 4C 2B 1B 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 27 17 66 50 46 52 98 9A 2E D6 E1 0F E9 F7 06 E8 F6 06 D6 E1 0F A1 A4 2A 5A 52 4D 2B 1C 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 29 19 65 55 4D 4F 9D A0 2C D6 E1 0F E9 F7 06 E8 F6 06 D7 E2 0F A1 A4 2A 5A 52 4D 2B 1C 64 1D 0B 6B 1B 09 6C 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2A 1A 65 55 4C 4F 9D A0 2C D7 E2 0F E9 F7 06 E8 F6 06 D8 E4 0E A8 AC 26 61 5A 49 31 23 61 1E 0D 6A 1B 09 6C 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 2C 1D 63 56 4E 4F 9E A1 2B D5 E0 10 E7 F5 07 EA F8 06 DD E9 0C AD B2 24 66 60 47 34 26 60 20 0F 6A 1B 09 6C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2B 1B 64 54 4B 50 9B 9D 2D D3 DE 11 E7 F5 07 EB FA 05 DE EB 0B B1 B6 22 6C 66 44 39 2B 5D 1F 0E 6A AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1D 0B 6B 2A 1A 65 53 4A 50 94 95 30 CF DA 13 E6 F4 07 E9 F7 06 DD EA 0C B4 BA 20 6F 6A 42 38 2A 5E AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 28 18 65 4D 43 53 8E 8E 33 CB D5 15 E5 F2 08 E7 F5 07 DE EB 0B B4 BA 20 71 6D 41 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 27 17 66 49 3E 55 88 87 36 C9 D2 16 E4 F2 08 E7 F5 07 DD EA 0C B7 BD 1F AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 24 13 68 47 3C 56 88 87 36 C5 CE 18 E3 F1 09 E8 F6 06 E0 ED 0B AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 25 14 67 45 3A 57 87 86 37 C5 CD 18 E4 F2 08 EB F9 05 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 25 14 67 43 38 58 82 80 39 C2 CA 19 E4 F2 08 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0A 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1B 09 6C 1C 0A 6C 23 13 68 41 35 59 77 74 3E BA C1 1D AA BB
此文件类型无法预览
......@@ -3,17 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33414.496
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LoadCSVLibrary", "LoadCVSLibrary\LoadCSVLibrary.csproj", "{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "Core\Core.csproj", "{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{43CDD09E-FCF3-4960-A01D-3BBFE9933122}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Infrastructure\Common\Common.csproj", "{43CDD09E-FCF3-4960-A01D-3BBFE9933122}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceLibrary", "DeviceLibrary\DeviceLibrary.csproj", "{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LoadCSVLibrary", "Infrastructure\LoadCVSLibrary\LoadCSVLibrary.csproj", "{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheMachine", "TheMachine\TheMachine.csproj", "{61FDFF14-8BB7-439A-85A0-592E3011F4C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImgCheckReel", "ImgCheckReel\ImgCheckReel.csproj", "{2BA382F5-D68E-4B03-B6E0-A75662B3938A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChangeConfigKey", "ChangeConfigKey\ChangeConfigKey.csproj", "{595AEE30-1B33-4C17-BA74-4AA13AC0DF55}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UI", "UI\UI.csproj", "{61FDFF14-8BB7-439A-85A0-592E3011F4C4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -21,30 +17,22 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Debug|Any CPU.Build.0 = Debug|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Release|Any CPU.ActiveCfg = Release|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Release|Any CPU.Build.0 = Release|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Release|Any CPU.Build.0 = Release|Any CPU
{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB23296C-AA1D-45C6-9FA6-5A37B2ABFE9B}.Release|Any CPU.Build.0 = Release|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43CDD09E-FCF3-4960-A01D-3BBFE9933122}.Release|Any CPU.Build.0 = Release|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Debug|Any CPU.Build.0 = Debug|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Release|Any CPU.ActiveCfg = Release|Any CPU
{064BEBF5-8FAA-4EA2-A5F3-A06E6E7D9251}.Release|Any CPU.Build.0 = Release|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Release|Any CPU.Build.0 = Release|Any CPU
{2BA382F5-D68E-4B03-B6E0-A75662B3938A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2BA382F5-D68E-4B03-B6E0-A75662B3938A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2BA382F5-D68E-4B03-B6E0-A75662B3938A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2BA382F5-D68E-4B03-B6E0-A75662B3938A}.Release|Any CPU.Build.0 = Release|Any CPU
{595AEE30-1B33-4C17-BA74-4AA13AC0DF55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{595AEE30-1B33-4C17-BA74-4AA13AC0DF55}.Debug|Any CPU.Build.0 = Debug|Any CPU
{595AEE30-1B33-4C17-BA74-4AA13AC0DF55}.Release|Any CPU.ActiveCfg = Release|Any CPU
{595AEE30-1B33-4C17-BA74-4AA13AC0DF55}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
此文件类型无法预览
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
此文件类型无法预览
此文件类型无法预览
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 67 6D 44 43 4D 53 D7 98 E8 D9 99 EA D9 99 EA EE 42 91 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 94 E6 F0 39 87 FF 00 4C FE 00 4D FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FE 04 01 FD 03 01 D8 97 E7 D9 99 EA D9 99 EA DA 94 E6 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 D9 99 EA DA 94 E5 EF 3E 8C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 DF 5A AA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 00 FF 00 00 FF 00 00 E3 6E A8 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C E7 5F B0 D8 98 EA D9 99 EA DE 86 D7 F7 1E 6B FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 43 FF 00 43 FF 00 1D FF 00 00 E3 6F A8 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D8 98 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E8 5B AA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4A FF 00 00 FF 00 00 E3 6E A8 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D8 98 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C EC 4C 9B D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 24 FF 00 00 FF 00 00 E3 6E A8 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D8 98 EA DA 94 E5 F7 1E 6B FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 DA 38 83 FF 00 4C FF 00 4C FF 00 4A FF 00 1D FF 00 00 FF 00 00 E3 6E A8 D9 99 EA D9 99 EA D9 99 EA EF 3E 8C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 95 E7 F7 1E 6B FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 DA 94 E5 FE 05 51 FF 00 4C FF 00 4C FF 00 4C FF 00 43 FF 00 1D FF 00 00 D9 96 E6 D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D7 95 E7 F0 3C 8A FF 00 4D FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA EB 51 A0 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4A FF 00 1D ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 99 EA DB 8D DE F0 39 87 FF 00 4C FF 00 4C EF 02 4F FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EB D8 98 EA EB 51 A0 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4A FF 00 00 FE 05 07 E1 7C BC D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF D9 99 EA D9 99 EA D9 99 EA DB 8D DE F0 39 87 FF 00 4C FB 01 4D AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA D8 98 EA D9 99 EA E8 4F 9E FF 00 4C FF 00 4C FF 00 4C FF 00 1D FF 00 00 FF 00 00 E3 6F A9 D9 99 EA D9 99 EA D9 99 EA DA 96 E7 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D8 98 EA DE 86 D7 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D8 98 EA FE 05 51 FF 00 4C FF 00 4C FF 00 4A FF 00 1D FF 00 00 FF 00 00 EB 4C 72 D9 99 EA D9 99 EA D9 99 EA E4 6C BC FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D8 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA E3 6E BE FF 00 4C FF 00 4C FF 00 4C FF 00 4A FF 00 1D FF 00 00 FF 00 00 DA 94 E3 D9 99 EA D9 99 EA D9 99 EA E4 6C BC FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E8 5B AA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DB 90 E1 F0 39 87 FF 00 4C FF 00 4C FF 00 4A FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA E5 63 B3 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 F5 26 74 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 96 E8 F0 39 87 FF 00 4C FF 00 4C FF 00 24 FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA EF 3C 8B FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FE 05 51 D9 99 EA D9 99 EA D7 98 E9 D9 99 EA D9 99 EA D9 99 EA D9 96 E8 F0 39 87 FF 00 4C FF 00 4A FF 00 1D FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 97 E8 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4D FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C D9 99 EA D9 99 EA D9 99 EA D7 98 E9 D9 99 EA D9 99 EA D9 99 EA DA 94 E6 F0 39 87 FF 00 4C FF 00 4A FF 00 1D FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 87 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FA 13 60 E7 5F AF D9 99 EA D7 98 E9 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4A FF 00 00 FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D7 98 E9 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 01 1D FF 00 00 FF 00 00 FF 00 00 ED 48 6E D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4D FF 00 4C FC 00 4D AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FD 02 4B FF 00 1D FF 00 00 FF 00 00 FF 00 00 FF 00 00 D1 79 B0 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 E3 73 C3 EF 3E 8C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FD 02 4B FF 00 1D FF 00 00 FF 00 00 FF 00 00 FF 00 00 CA 5B 7E D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FC 03 50 E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 FF 00 4C FD 02 4B FF 00 1D FF 00 00 FF 00 00 FF 00 00 FF 00 00 CA 5B 7D D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D8 98 EA DA 94 E5 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 EF 3E 8C FF 00 4C FF 00 4C FF 00 4C FC 03 4F E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA ED 48 96 FF 00 4C FE 02 4B FF 00 1D FF 00 00 FF 00 00 FF 00 00 FF 00 00 D7 91 DD D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 E4 6E BD D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FE 00 4D C1 33 81 D9 99 EA D9 99 EB D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 43 FF 00 1D FF 00 00 FF 00 00 ED 48 79 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C ED 48 96 D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C C1 33 81 D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 43 FF 00 1D FF 00 45 FF 00 4C FF 00 4C ED 48 96 D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FD 0A 55 DF 84 D4 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C C4 30 7E D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C ED 48 96 D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FE 00 4D FF 00 4C FF 00 4C FE 05 51 E0 7A CB D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C D0 28 76 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 97 E8 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C ED 48 96 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E0 7A CB D9 99 EA D9 99 EA D9 99 EA DA 94 E5 FF 00 4C FF 00 4C FF 00 4C FF 00 4C F0 02 4F CD 6F BE D9 99 EA D9 99 EA D9 99 EA D9 99 EA E4 3F 8E FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 E0 7A CB D9 99 EA D9 99 EA D9 99 EA F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C E7 50 9F D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 D9 97 E8 D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C ED 48 96 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C EC 4B 99 D9 99 EA D9 99 EA D9 99 EA DA 94 E5 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C ED 48 96 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C FF 00 4A FF 00 39 FF 00 1D AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C EA 4A 98 D9 99 EA D9 99 EA D9 99 EA F0 39 87 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C EC 4B 99 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DE 86 D7 F0 39 87 FF 00 4C FF 00 4A AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C D9 94 E6 D9 99 EA D9 99 EA D9 99 EA E1 6A BB FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C E7 5F AF D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 F0 39 87 FF 00 4C AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 01 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C ED 48 96 D9 99 EA D9 99 EA D9 99 EA D9 99 EA 9F 42 92 FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FF 00 4C FE 05 51 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA DA 94 E5 FF 00 2D AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F5 E7 07 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F6 E8 06 F7 E9 06 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F8 EA 06 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 EF E1 0A F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 FA EB 05 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F7 E9 06 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
DD 55 EE 00 00 00 01 00 99 01 00 00 00 5A 00 0B D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA D9 99 EA F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 F2 FF 00 AA BB
20230817
转臂旋转前,料串先下降一段距离,然后转臂转过来。避免料盘翘边转臂碰到
\ No newline at end of file
......@@ -67,6 +67,10 @@
<Reference Include="halcondotnet">
<HintPath>..\DLL\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="HuichuanLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\DLL\HuichuanLibrary.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\DLL\log4net.dll</HintPath>
</Reference>
......@@ -88,118 +92,139 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AboutBox1.cs">
<Compile Include="Controls\userControl\AxisMoveControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Controls\userControl\AxisMoveControl.Designer.cs">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</Compile>
<Compile Include="Controls\userControl\AxisTipControl.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\userControl\AxisTipControl.Designer.cs">
<DependentUpon>AxisTipControl.cs</DependentUpon>
</Compile>
<Compile Include="Controls\userControl\ToucDownBtn.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Forms\AboutBox1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AboutBox1.Designer.cs">
<Compile Include="Forms\AboutBox1.Designer.cs">
<DependentUpon>AboutBox1.cs</DependentUpon>
</Compile>
<Compile Include="AxisControl.cs">
<Compile Include="Controls\AxisControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="AxisControl.Designer.cs">
<Compile Include="Controls\AxisControl.Designer.cs">
<DependentUpon>AxisControl.cs</DependentUpon>
</Compile>
<Compile Include="Form1.cs">
<Compile Include="Forms\Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<Compile Include="Forms\Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="IOControls.cs">
<Compile Include="Controls\IOControls.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="IOControls.Designer.cs">
<Compile Include="Controls\IOControls.Designer.cs">
<DependentUpon>IOControls.cs</DependentUpon>
</Compile>
<Compile Include="LogControl.cs">
<Compile Include="Controls\LogControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="LogControl.Designer.cs">
<Compile Include="Controls\LogControl.Designer.cs">
<DependentUpon>LogControl.cs</DependentUpon>
</Compile>
<Compile Include="positionTool\FrmPositionTool.cs">
<Compile Include="Forms\positionTool\FrmPositionTool.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="positionTool\FrmPositionTool.Designer.cs">
<Compile Include="Forms\positionTool\FrmPositionTool.Designer.cs">
<DependentUpon>FrmPositionTool.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SettingControl.cs">
<Compile Include="Controls\SettingControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SettingControl.Designer.cs">
<Compile Include="Controls\SettingControl.Designer.cs">
<DependentUpon>SettingControl.cs</DependentUpon>
</Compile>
<Compile Include="UC\frmHSVdebug.cs">
<Compile Include="Controls\UC\frmHSVdebug.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UC\frmHSVdebug.Designer.cs">
<Compile Include="Controls\UC\frmHSVdebug.Designer.cs">
<DependentUpon>frmHSVdebug.cs</DependentUpon>
</Compile>
<Compile Include="UC\FrmPassCheck.cs">
<Compile Include="Controls\UC\FrmPassCheck.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UC\FrmPassCheck.designer.cs">
<Compile Include="Controls\UC\FrmPassCheck.designer.cs">
<DependentUpon>FrmPassCheck.cs</DependentUpon>
</Compile>
<Compile Include="UC\StorePosControl.cs">
<Compile Include="Controls\UC\StorePosControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\StorePosControl.designer.cs">
<Compile Include="Controls\UC\StorePosControl.designer.cs">
<DependentUpon>StorePosControl.cs</DependentUpon>
</Compile>
<Compile Include="UC\ConfigControl.cs">
<Compile Include="Controls\UC\ConfigControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\ConfigControl.designer.cs">
<Compile Include="Controls\UC\ConfigControl.designer.cs">
<DependentUpon>ConfigControl.cs</DependentUpon>
</Compile>
<Compile Include="UC\CylinderButton.cs">
<Compile Include="Controls\UC\CylinderButton.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="UC\IOControl.cs">
<Compile Include="Controls\UC\IOControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\IOControl.Designer.cs">
<Compile Include="Controls\UC\IOControl.Designer.cs">
<DependentUpon>IOControl.cs</DependentUpon>
</Compile>
<Compile Include="UC\uc_boxdebug.cs">
<Compile Include="Controls\UC\uc_boxdebug.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\uc_boxdebug.Designer.cs">
<Compile Include="Controls\UC\uc_boxdebug.Designer.cs">
<DependentUpon>uc_boxdebug.cs</DependentUpon>
</Compile>
<Compile Include="UC\UC_LedConfig.cs">
<Compile Include="Controls\UC\UC_LedConfig.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\UC_LedConfig.Designer.cs">
<Compile Include="Controls\UC\UC_LedConfig.Designer.cs">
<DependentUpon>UC_LedConfig.cs</DependentUpon>
</Compile>
<Compile Include="UC\UC_SetUserPassword.cs">
<Compile Include="Controls\UC\UC_SetUserPassword.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UC\UC_SetUserPassword.designer.cs">
<Compile Include="Controls\UC\UC_SetUserPassword.designer.cs">
<DependentUpon>UC_SetUserPassword.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="AboutBox1.resx">
<EmbeddedResource Include="Controls\userControl\AxisMoveControl.resx">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\userControl\AxisTipControl.resx">
<DependentUpon>AxisTipControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\AboutBox1.resx">
<DependentUpon>AboutBox1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="AxisControl.resx">
<EmbeddedResource Include="Controls\AxisControl.resx">
<DependentUpon>AxisControl.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Form1.resx">
<EmbeddedResource Include="Forms\Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="IOControls.resx">
<EmbeddedResource Include="Controls\IOControls.resx">
<DependentUpon>IOControls.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="LogControl.resx">
<EmbeddedResource Include="Controls\LogControl.resx">
<DependentUpon>LogControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="positionTool\FrmPositionTool.resx">
<EmbeddedResource Include="Forms\positionTool\FrmPositionTool.resx">
<DependentUpon>FrmPositionTool.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
......@@ -212,31 +237,31 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="SettingControl.resx">
<EmbeddedResource Include="Controls\SettingControl.resx">
<DependentUpon>SettingControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\frmHSVdebug.resx">
<EmbeddedResource Include="Controls\UC\frmHSVdebug.resx">
<DependentUpon>frmHSVdebug.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\FrmPassCheck.resx">
<EmbeddedResource Include="Controls\UC\FrmPassCheck.resx">
<DependentUpon>FrmPassCheck.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\StorePosControl.resx">
<EmbeddedResource Include="Controls\UC\StorePosControl.resx">
<DependentUpon>StorePosControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\ConfigControl.resx">
<EmbeddedResource Include="Controls\UC\ConfigControl.resx">
<DependentUpon>ConfigControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\IOControl.resx">
<EmbeddedResource Include="Controls\UC\IOControl.resx">
<DependentUpon>IOControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\uc_boxdebug.resx">
<EmbeddedResource Include="Controls\UC\uc_boxdebug.resx">
<DependentUpon>uc_boxdebug.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\UC_LedConfig.resx">
<EmbeddedResource Include="Controls\UC\UC_LedConfig.resx">
<DependentUpon>UC_LedConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UC\UC_SetUserPassword.resx">
<EmbeddedResource Include="Controls\UC\UC_SetUserPassword.resx">
<DependentUpon>UC_SetUserPassword.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.manifest" />
......@@ -263,20 +288,6 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\DeviceLibrary\DeviceLibrary.csproj">
<Project>{bb23296c-aa1d-45c6-9fa6-5a37b2abfe9b}</Project>
<Name>DeviceLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\LoadCVSLibrary\LoadCSVLibrary.csproj">
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
<EmbeddedResource Include="ledColor\green.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
......@@ -285,6 +296,15 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<Content Include="mimo.ico" />
<Content Include="sounds\doorClose.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="sounds\doorOpen.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="sounds\string_filling.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="更新记录.txt" />
</ItemGroup>
<ItemGroup>
......@@ -299,6 +319,20 @@
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj">
<Project>{bb23296c-aa1d-45c6-9fa6-5a37b2abfe9b}</Project>
<Name>Core</Name>
</ProjectReference>
<ProjectReference Include="..\Infrastructure\Common\Common.csproj">
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\Infrastructure\LoadCVSLibrary\LoadCSVLibrary.csproj">
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
......
20230817
转臂旋转前,料串先下降一段距离,然后转臂转过来。避免料盘翘边转臂碰到
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!