From 0d97500a3aac13b642fc93fae2e5dd01e1086b21 Mon Sep 17 00:00:00 2001 From: wells.liu <wells.liu@broconcentric.com> Date: 星期一, 29 六月 2020 12:31:12 +0800 Subject: [PATCH] 暂存 固高板卡 --- src/Bro.Device.GTSCard/Bro.Device.GTSCard.csproj | 10 src/Bro.Device.GTSCard/GTSCardDriver.cs | 1037 ++++++++++++++++++++- src/Bro.Device.GTSCard/GTS800.cfg | 793 ++++++++++++++++ src/Bro.Device.GTSCard/gts.dll | 0 src/Bro.Device.GTSCard/packages.config | 4 src/Bro.Common.Model/Helper/EnumHelper.cs | 140 ++ src/Bro.Device.GTSCard/GTSCardConfig.cs | 854 +++++++++++++---- src/Bro.Device.GTSCard/GTSCardAPI.cs | 10 8 files changed, 2,571 insertions(+), 277 deletions(-) diff --git a/src/Bro.Common.Model/Helper/EnumHelper.cs b/src/Bro.Common.Model/Helper/EnumHelper.cs index aa404aa..cc90e89 100644 --- a/src/Bro.Common.Model/Helper/EnumHelper.cs +++ b/src/Bro.Common.Model/Helper/EnumHelper.cs @@ -443,5 +443,145 @@ [Description("鐩告満鍧愭爣绯荤浉瀵硅繍鍔�")] CameraRelativeMove = 12, } + + /// <summary> + /// 椹揪/杩愬姩鏉垮崱杩愯妯″紡 + /// </summary> + public enum MotorMoveMode + { + /// <summary> + /// 鏅�氱偣浣嶈繍鍔� + /// </summary> + [Description("鏅�氱偣浣嶈繍鍔�")] + Normal = 1, + + ///// <summary> + ///// 楂橀�熺瓑璺濊繍鍔� + ///// </summary> + //[Description("楂橀�熺瓑璺濊繍鍔�")] + //HighSpeedStep = 2, + + ///// <summary> + ///// 楂橀�熶笉绛夎窛杩愬姩 + ///// </summary> + //[Description("楂橀�熶笉绛夎窛杩愬姩")] + //HighSpeed = 3, + + /// <summary> + /// 鎵炬闄愪綅杩愬姩 + /// </summary> + [Description("鎵炬闄愪綅杩愬姩")] + FindPositive = 4, + + /// <summary> + /// 绂诲紑姝i檺浣� + /// </summary> + [Description("绂诲紑姝i檺浣�")] + LeavePositive = 5, + + /// <summary> + /// 鎵捐礋闄愪綅杩愬姩 + /// </summary> + [Description("鎵捐礋闄愪綅杩愬姩")] + FindNegative = 6, + + /// <summary> + /// 绂诲紑璐熼檺浣� + /// </summary> + [Description("绂诲紑璐熼檺浣�")] + LeaveNegative = 7, + + /// <summary> + /// 鎵惧師鐐硅繍鍔� + /// </summary> + [Description("鎵惧師鐐硅繍鍔�")] + FindOri = 8, + + /// <summary> + /// Jog妯″紡 + /// </summary> + [Description("Jog妯″紡")] + Jog = 9, + + /// <summary> + /// 璇绘暟澶存壘鍘熺偣鏂瑰紡 + /// </summary> + [Description("璇绘暟澶存壘鍘熺偣鏂瑰紡")] + FindOriIndex = 10, + + /// <summary> + /// 鎻掕ˉ妯″紡 + /// </summary> + [Description("鎻掕ˉ妯″紡")] + Coordinate = 11, + + ///// <summary> + ///// 鍒�鍚戞洿闅忓姛鑳� + ///// </summary> + //[Description("鍒�鍚戞洿闅忓姛鑳�")] + //BufMove = 12, + } + + /// <summary> + /// 椹揪IO瀹氫箟绫诲瀷 + /// </summary> + public enum MotorIODefine + { + Nothing, + InputStartLeft, + InputStartRight, + InputCurtainLeft, + InputCurtainRight, + InputSafeDoor, + InputEmergency, + InputReset, + InputScrew1, + InputScrew2, + InputSuckLeft, + InputSuckRight, + InputSuckXYZ, + InputCylinderLeftLimitFront, + InputCylinderLeftLimitBack, + InputCylinderRightLimitFront, + InputCylinderRightLimitBack, + + + OutputYellow, + OutputGreen, + OutputRed, + OutputBeep, + OutputLight, + OutputMotorPower, + OutputInitOK, + OutputZLock, + OutputLeftCylinder, + OutputRightCylinder, + OutputLeftSuck, + OutputRightSuck, + OutputScrewBlow, + OutputCamera, + OutputScrewSuck, + } + + /// <summary> + /// GTS杩愬姩鏉垮崱鎺у埗杩斿洖鎺у埗鐮� + /// </summary> + public enum GTSRetCode + { + [Description("鎸囦护鎵ц鎴愬姛")] + GRCRunOK = 0, // 鎸囦护鎵ц鎴愬姛 + [Description("鎸囦护鎵ц閿欒")] + GRCRunErr = 1, // 鎸囦护鎵ц閿欒 + [Description("icense涓嶆敮鎸�")] + GRCNotSupport = 2, // icense涓嶆敮鎸� + [Description("鎸囦护鍙傛暟閿欒")] + GRCInvalidParam = 7, // 鎸囦护鍙傛暟閿欒 + [Description("涓绘満鍜岃繍鍔ㄦ帶鍒跺櫒閫氳澶辫触")] + GRCCommErr = -1, // 涓绘満鍜岃繍鍔ㄦ帶鍒跺櫒閫氳澶辫触 + [Description("鎵撳紑鎺у埗鍣ㄥけ璐�")] + GRCOpenErr = -6, // 鎵撳紑鎺у埗鍣ㄥけ璐� + [Description("杩愬姩鎺у埗鍣ㄦ病鏈夊搷搴�")] + GRCNotAck = -7 // 杩愬姩鎺у埗鍣ㄦ病鏈夊搷搴� + } } } diff --git a/src/Bro.Device.GTSCard/Bro.Device.GTSCard.csproj b/src/Bro.Device.GTSCard/Bro.Device.GTSCard.csproj index d26bb8b..774e9c9 100644 --- a/src/Bro.Device.GTSCard/Bro.Device.GTSCard.csproj +++ b/src/Bro.Device.GTSCard/Bro.Device.GTSCard.csproj @@ -31,6 +31,9 @@ <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> + <Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> + </Reference> <Reference Include="System" /> <Reference Include="System.Configuration" /> <Reference Include="System.Core" /> @@ -63,5 +66,12 @@ <Name>Bro.Common.Model</Name> </ProjectReference> </ItemGroup> + <ItemGroup> + <Content Include="gts.dll" /> + </ItemGroup> + <ItemGroup> + <None Include="GTS800.cfg" /> + <None Include="packages.config" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Project> \ No newline at end of file diff --git a/src/Bro.Device.GTSCard/GTS800.cfg b/src/Bro.Device.GTSCard/GTS800.cfg new file mode 100644 index 0000000..ac68f46 --- /dev/null +++ b/src/Bro.Device.GTSCard/GTS800.cfg @@ -0,0 +1,793 @@ +[profile1] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile2] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile3] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile4] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile5] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile6] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile7] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[profile8] +active=1 +decSmoothStop=1.000000 +decAbruptStop=1000.000000 +[axis1] +active=1 +alarmType=2 +alarmIndex=1 +limitPositiveType=0 +limitPositiveIndex=1 +limitNegativeType=1 +limitNegativeIndex=1 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=5 +prfMap=0x1 +encMap=0x1 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis2] +active=1 +alarmType=2 +alarmIndex=2 +limitPositiveType=0 +limitPositiveIndex=2 +limitNegativeType=1 +limitNegativeIndex=2 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=5 +prfMap=0x2 +encMap=0x2 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis3] +active=1 +alarmType=2 +alarmIndex=3 +limitPositiveType=0 +limitPositiveIndex=3 +limitNegativeType=1 +limitNegativeIndex=3 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=5 +prfMap=0x4 +encMap=0x4 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis4] +active=1 +alarmType=2 +alarmIndex=4 +limitPositiveType=0 +limitPositiveIndex=4 +limitNegativeType=1 +limitNegativeIndex=4 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=5 +prfMap=0x8 +encMap=0x8 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis5] +active=1 +alarmType=2 +alarmIndex=5 +limitPositiveType=0 +limitPositiveIndex=5 +limitNegativeType=1 +limitNegativeIndex=5 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=-1 +prfMap=0x10 +encMap=0x10 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis6] +active=1 +alarmType=2 +alarmIndex=6 +limitPositiveType=0 +limitPositiveIndex=6 +limitNegativeType=1 +limitNegativeIndex=6 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=-1 +prfMap=0x20 +encMap=0x20 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis7] +active=1 +alarmType=2 +alarmIndex=7 +limitPositiveType=0 +limitPositiveIndex=7 +limitNegativeType=1 +limitNegativeIndex=7 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=-1 +prfMap=0x40 +encMap=0x40 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[axis8] +active=1 +alarmType=2 +alarmIndex=8 +limitPositiveType=0 +limitPositiveIndex=8 +limitNegativeType=1 +limitNegativeIndex=8 +smoothStopType=4 +smoothStopIndex=-1 +abruptStopType=4 +abruptStopIndex=-1 +prfMap=0x80 +encMap=0x80 +prfMapAlpha1=1 +prfMapBeta1=1 +prfMapAlpha2=1 +prfMapBeta2=1 +encMapAlpha1=1 +encMapBeta1=1 +encMapAlpha2=1 +encMapBeta2=1 +[dac1] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac2] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac3] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac4] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac5] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac6] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac7] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac8] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac9] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac10] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac11] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[dac12] +active=1 +control=-1 +reverse=0 +bias=0 +limit=32767 +[step1] +active=1 +axis=1 +mode=0 +parameter=0 +reverse=0 +[step2] +active=1 +axis=2 +mode=0 +parameter=0 +reverse=0 +[step3] +active=1 +axis=3 +mode=0 +parameter=0 +reverse=0 +[step4] +active=1 +axis=4 +mode=0 +parameter=0 +reverse=0 +[encoder1] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder2] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder3] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder4] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder5] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder6] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder7] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder8] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder9] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder10] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[encoder11] +active=1 +reverse=1 +filterType=0 +captureSource=0 +captureHomeSense=0 +captureIndexSense=0 +[enable1] +active=1 +axis=1 +axisItem=-1 +reverse=1 +[enable2] +active=1 +axis=2 +axisItem=-1 +reverse=1 +[enable3] +active=1 +axis=3 +axisItem=-1 +reverse=1 +[enable4] +active=1 +axis=4 +axisItem=-1 +reverse=1 +[enable5] +active=1 +axis=5 +axisItem=-1 +reverse=1 +[enable6] +active=1 +axis=6 +axisItem=-1 +reverse=1 +[enable7] +active=1 +axis=7 +axisItem=-1 +reverse=1 +[enable8] +active=1 +axis=8 +axisItem=-1 +reverse=1 +[clear1] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear2] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear3] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear4] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear5] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear6] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear7] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[clear8] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo1] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo2] +active=1 +axis=-1 +axisItem=-1 +reverse=1 +[gpo3] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo4] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo5] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo6] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo7] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo8] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo9] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo10] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo11] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo12] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo13] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo14] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo15] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[gpo16] +active=1 +axis=-1 +axisItem=-1 +reverse=0 +[limitPositive1] +active=1 +reverse=0 +filterTime=3 +[limitPositive2] +active=1 +reverse=0 +filterTime=3 +[limitPositive3] +active=1 +reverse=0 +filterTime=3 +[limitPositive4] +active=1 +reverse=0 +filterTime=3 +[limitPositive5] +active=1 +reverse=0 +filterTime=3 +[limitPositive6] +active=1 +reverse=0 +filterTime=3 +[limitPositive7] +active=1 +reverse=0 +filterTime=3 +[limitPositive8] +active=1 +reverse=0 +filterTime=3 +[limitNegative1] +active=1 +reverse=0 +filterTime=3 +[limitNegative2] +active=1 +reverse=0 +filterTime=3 +[limitNegative3] +active=1 +reverse=0 +filterTime=3 +[limitNegative4] +active=1 +reverse=0 +filterTime=3 +[limitNegative5] +active=1 +reverse=0 +filterTime=3 +[limitNegative6] +active=1 +reverse=0 +filterTime=3 +[limitNegative7] +active=1 +reverse=0 +filterTime=3 +[limitNegative8] +active=1 +reverse=0 +filterTime=3 +[alarm1] +active=1 +reverse=0 +filterTime=3 +[alarm2] +active=1 +reverse=0 +filterTime=3 +[alarm3] +active=1 +reverse=0 +filterTime=3 +[alarm4] +active=1 +reverse=0 +filterTime=3 +[alarm5] +active=1 +reverse=0 +filterTime=3 +[alarm6] +active=1 +reverse=0 +filterTime=3 +[alarm7] +active=1 +reverse=0 +filterTime=3 +[alarm8] +active=1 +reverse=0 +filterTime=3 +[home1] +active=1 +reverse=0 +filterTime=3 +[home2] +active=1 +reverse=0 +filterTime=3 +[home3] +active=1 +reverse=0 +filterTime=3 +[home4] +active=1 +reverse=0 +filterTime=3 +[home5] +active=1 +reverse=0 +filterTime=3 +[home6] +active=1 +reverse=0 +filterTime=3 +[home7] +active=1 +reverse=0 +filterTime=3 +[home8] +active=1 +reverse=0 +filterTime=3 +[gpi1] +active=1 +reverse=0 +filterTime=3 +[gpi2] +active=1 +reverse=0 +filterTime=3 +[gpi3] +active=1 +reverse=0 +filterTime=3 +[gpi4] +active=1 +reverse=0 +filterTime=3 +[gpi5] +active=1 +reverse=0 +filterTime=3 +[gpi6] +active=1 +reverse=0 +filterTime=3 +[gpi7] +active=1 +reverse=0 +filterTime=3 +[gpi8] +active=1 +reverse=0 +filterTime=3 +[gpi9] +active=1 +reverse=0 +filterTime=3 +[gpi10] +active=1 +reverse=0 +filterTime=3 +[gpi11] +active=1 +reverse=0 +filterTime=3 +[gpi12] +active=1 +reverse=0 +filterTime=3 +[gpi13] +active=1 +reverse=0 +filterTime=3 +[gpi14] +active=1 +reverse=0 +filterTime=3 +[gpi15] +active=1 +reverse=0 +filterTime=3 +[gpi16] +active=1 +reverse=0 +filterTime=3 +[arrive1] +active=1 +reverse=0 +filterTime=3 +[arrive2] +active=1 +reverse=0 +filterTime=3 +[arrive3] +active=1 +reverse=0 +filterTime=3 +[arrive4] +active=1 +reverse=0 +filterTime=3 +[arrive5] +active=1 +reverse=0 +filterTime=3 +[arrive6] +active=1 +reverse=0 +filterTime=3 +[arrive7] +active=1 +reverse=0 +filterTime=3 +[arrive8] +active=1 +reverse=0 +filterTime=3 +[mpg1] +active=1 +reverse=0 +filterTime=3 +[mpg2] +active=1 +reverse=0 +filterTime=3 +[mpg3] +active=1 +reverse=0 +filterTime=3 +[mpg4] +active=1 +reverse=0 +filterTime=3 +[mpg5] +active=1 +reverse=0 +filterTime=3 +[mpg6] +active=1 +reverse=0 +filterTime=3 +[mpg7] +active=1 +reverse=0 +filterTime=3 diff --git a/src/Bro.Device.GTSCard/GTSCardAPI.cs b/src/Bro.Device.GTSCard/GTSCardAPI.cs index 0ddd544..0a83f81 100644 --- a/src/Bro.Device.GTSCard/GTSCardAPI.cs +++ b/src/Bro.Device.GTSCard/GTSCardAPI.cs @@ -143,6 +143,16 @@ public const short LASER_CTRL_VOLTAGE = 2; public const short LASER_CTRL_MODE_PWM2 = 3; + //鎸囦护杩斿洖鍊� + public const short ResultSuccess = 0; + public const short ResultError = 1; + public const short ResultNotSupported = 2; + public const short ParameterError = 7; + public const short CommunicationFailed = -1; + public const short OpenFailed = -6; + public const short NoResponse = -7; + + public struct TTrapPrm { public double acc; diff --git a/src/Bro.Device.GTSCard/GTSCardConfig.cs b/src/Bro.Device.GTSCard/GTSCardConfig.cs index 49d9c60..de7aad9 100644 --- a/src/Bro.Device.GTSCard/GTSCardConfig.cs +++ b/src/Bro.Device.GTSCard/GTSCardConfig.cs @@ -1,247 +1,675 @@ 锘縰sing Bro.Common.Base; using Bro.Common.Helper; using Bro.Common.Interface; +using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Configuration; using System.Drawing.Design; +using System.Linq; +using System.Threading; +using static Bro.Common.Helper.EnumHelper; namespace Bro.Device.GTSCard { - public abstract class GTSCardOperationConfigBase : OperationConfigBase + + [Device("GTSCard", "鍥洪珮鏉垮崱", EnumHelper.DeviceAttributeType.OperationConfig)] + public class GTSCardOperationConfig : OperationConfigBase, IComplexDisplay { - ///// <summary> - ///// 闇�瑕佹搷浣滅殑PLC椤� - ///// </summary> - //public List<PLCItem> Items { get; set; } = new List<PLCItem>(); + [Category("鏉垮崱杩愬姩閰嶇疆")] + [DisplayName("杩愬姩閰嶇疆闆嗗悎")] + [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<MovingOption>), typeof(UITypeEditor))] + public ObservableCollection<MovingOption> MovingOps { get; set; } = new ObservableCollection<MovingOption>(); + + public string GetDisplayText() + { + return MovingOps.Count() == 0 ? "--" : string.Join(";", MovingOps.Select(m => m.GetDisplayText())); + } } - //public class GTSCardInitialConfigBase : InitialConfigBase, IMonitorConfig - //{ - // [Category("椹卞姩绫诲瀷")] - // [Description("椹卞姩绫诲瀷")] - // [DisplayName("椹卞姩绫诲瀷")] - // [TypeConverter(typeof(PLCTypeConverter))] - // public override string DriverType { get; set; } + [Device("GTSCard", "鍥洪珮鏉垮崱", EnumHelper.DeviceAttributeType.OperationConfig)] + public class GTSCardInitialConfig : InitialConfigBase, IMonitorConfig + { + [Category("鏉垮崱閰嶇疆")] + [DisplayName("鍗″彿")] + [Description("CardNum锛氬崱鍙�")] + public int CardNum { get; set; } - // [Category("璀︽姤閰嶇疆")] - // [Description("璀︽姤閰嶇疆鍒楄〃")] - // [DisplayName("璀︽姤閰嶇疆")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(WarningSetsEditor), typeof(UITypeEditor))] - // public List<WarningSet> WarningSetCollection { get; set; } = new List<WarningSet>(); + //[Category("鏉垮崱閰嶇疆")] + //[Description("IO鍗″彿")] + //public int IOCardNum { get; set; } - // #region IMonitorConfig - // [Category("鐩戝惉璁剧疆")] - // [Description("鐩戝惉鎿嶄綔閰嶇疆闆嗗悎")] - // [DisplayName("鐩戝惉閰嶇疆")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor<MonitorSet>), typeof(UITypeEditor))] - // public List<IMonitorSet> MonitorSetCollection { get; set; } = new List<IMonitorSet>(); + [Category("鏉垮崱閰嶇疆")] + [DisplayName("鍒濆閰嶇疆鏂囦欢璺緞")] + [Description("InitialConfigFilePath锛氬垵濮嬮厤缃枃浠惰矾寰�")] + [Editor(typeof(FileDialogEditor), typeof(UITypeEditor))] + public string InitialConfigFilePath { get; set; } - // [Category("鐩戝惉璁剧疆")] - // [Description("true锛氬惎鍔ㄧ洃鍚� false锛氬叧闂洃鍚�")] - // [DisplayName("鐩戝惉鍚敤")] - // public bool IsEnableMonitor { get; set; } = true; + [Category("IO鎵弿閰嶇疆")] + [DisplayName("鎵弿闂撮殧")] + [Description("ScanInterval锛氭壂鎻忛棿闅旓紝浠ユ绉掍负鍗曚綅")] + public int ScanInterval { get; set; } = 100; - // [Category("鐩戝惉璁剧疆")] - // [Description("鎵弿闂撮殧鏃堕棿锛屽崟浣嶏細ms")] - // [DisplayName("鎵弿闂撮殧")] - // public int MonitorInterval { get; set; } = 100; + [Category("杞撮厤缃�")] + [DisplayName("杞存暟閲�")] + [Description("AxisNum锛氳酱鏁伴噺")] + public int AxisNum { get; set; } = 2; - // [Category("鐩戝惉璁剧疆")] - // [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")] - // [DisplayName("鐩戝惉瓒呮椂")] - // public int MonitorTimeout { get; set; } = 500; + [Category("杞撮厤缃�")] + [DisplayName("杞撮厤缃俊鎭泦鍚�")] + [Description("AxisSettings锛氳酱閰嶇疆淇℃伅闆嗗悎")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<AxisSetting>), typeof(UITypeEditor))] + public List<AxisSetting> AxisSettings { get; set; } = new List<AxisSetting>(); - // [Category("浜嬩欢鍦板潃璁剧疆")] - // [Description("浜嬩欢寮�濮嬪湴鍧�锛孭LC鐨勫疄闄呭瘎瀛樺櫒鍦板潃銆傚崄杩涘埗锛屼笉鍖呭惈鍔熻兘鐮併��")] - // [DisplayName("鐩戝惉寮�濮嬪湴鍧�")] - // public int EventStartAddress { get; set; } = 8000; + [Category("杞撮厤缃�")] + [DisplayName("杞撮�熷害姣旂巼")] + [Description("AxisVelocityRatio锛氳酱閫熷害姣旂巼")] + public double AxisVelocityRatio { get; set; } = 1; - // [Category("浜嬩欢鍦板潃璁剧疆")] - // [Description("浜嬩欢鍦板潃闀垮害锛屾渶澶ч暱搴�128")] - // [DisplayName("鐩戝惉闀垮害")] - // public int EventLength { get; set; } = 120; + [Category("寤舵椂閰嶇疆")] + [DisplayName("鍔ㄤ綔瀹屾垚鍚庡欢杩�")] + [Description("ActionAfterDelay锛氬姩浣滃畬鎴愬悗寤惰繜")] + public int ActionAfterDelay { get; set; } = 100; - // public List<IMonitorSet> GetAllMonitorSet() - // { - // WarningSetCollection.ForEach(m => m.Source = this.Name); + public bool IsEnableMonitor { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int MonitorInterval { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int MonitorTimeout { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public List<IMonitorSet> MonitorSetCollection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - // MonitorSetCollection.ForEach(m => m.SourceDevice = this.Id); - // return MonitorSetCollection; - // } - // #endregion - - // #region IMotion Related - // [Category("杩愬姩閰嶇疆")] - // [Description("杩愬姩杞寸姸鎬侀泦鍚�")] - // [DisplayName("杩愬姩杞寸姸鎬侀泦鍚�")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor<PLCMotionDefinition_State>), typeof(UITypeEditor))] - // public List<PLCMotionDefinition_State> MotionStateCollection { get; set; } = new List<PLCMotionDefinition_State>(); - // #endregion - //} + public List<IMonitorSet> GetAllMonitorSet() + { + throw new NotImplementedException(); + } + } /// <summary> - /// 鐐逛綅绫诲瀷 + /// 杞撮厤缃� /// </summary> - public enum PosType + public class AxisSetting : IComplexDisplay { - /// <summary> - /// 鐩寸嚎鎻掕ˉ - /// </summary> - Line = 1, - /// <summary> - /// 鍦嗗姬鎻掕ˉ(鍗婂緞) - /// </summary> - CircleRadius, - /// <summary> - /// 鍦嗗姬鎻掕ˉ(鍦嗗績) - /// </summary> - CircleCenter + [Category("杞撮厤缃�")] + [DisplayName("杞村彿绱㈠紩")] + [Description("AxisIndex锛氳酱鍙风储寮�")] + public int AxisIndex { get; set; } + + [Category("杞撮厤缃�")] + [DisplayName("杞村悕绉�")] + [Description("AxisName锛氳酱鍚嶇О")] + public string AxisName { get; set; } + + [Category("杞撮厤缃�")] + [DisplayName("杞存槸鍚﹀惎鐢�")] + [Description("IsAxisEnabled锛氳酱鏄惁鍚敤")] + public bool IsAxisEnabled { get; set; } = false; + + [Category("鎹㈢畻閰嶇疆")] + [DisplayName("鑴夊啿鏁版崲绠楁瘮渚�")] + [Description("鑴夊啿鏁板拰鍏朵粬璁¢噺鍗曚綅鐨勬崲绠楁瘮渚嬶紝渚嬪璁剧疆涓�1000锛岃〃绀�1000涓剦鍐茬瓑浜�1uint")] + public int PulseRatio { get; set; } = 1; + + [Category("閫熷害閰嶇疆")] + [DisplayName("榛樿閫熷害鍙傛暟")] + [Description("VelocityPara锛氶粯璁ら�熷害鍙傛暟")] + [TypeConverter(typeof(ComplexObjectConvert))] + [Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))] + public VelocityPara VelocityPara { get; set; } = new VelocityPara(); + + [Category("鍥炲師鐐硅缃�")] + [DisplayName("鍥炲師鐐规ā寮�")] + [Description("HomeMode锛氬洖鍘熺偣妯″紡銆�0锛氫竴鑸ā寮� 1锛氭瀬闄愰檺浣嶆ā寮� 2锛氬閮ㄨЕ鍙戞ā寮�")] + public int HomeMode { get; set; } = 0; + + [Category("鍥炲師鐐硅缃�")] + [DisplayName("鍥炲師鐐规柟鍚�")] + [Description("IsHomePositive锛氬洖鍘熺偣鏂瑰悜銆� true锛氭鏂瑰悜寮�濮� false锛氳礋鏂瑰悜寮�濮�")] + public bool IsHomePositive { get; set; } = true; + + [Category("鍥炲師鐐硅缃�")] + [DisplayName("鏄惁鑷姩鍥炲師鐐�")] + [Description("IsAutoGoHome锛氭槸鍚﹁嚜鍔ㄥ洖鍘熺偣銆� true锛氭槸 false锛氬惁")] + public bool IsAutoGoHome { get; set; } = false; + + [Category("瓒呮椂璁剧疆")] + [DisplayName("鍥炲師鐐硅秴鏃�")] + [Description("TimeOutHome锛氬洖鍘熺偣瓒呮椂锛屽崟浣嶆绉�")] + public int TimeOutHome { get; set; } = 30000; + + [Category("瓒呮椂璁剧疆")] + [DisplayName("杩愬姩瓒呮椂")] + [Description("TimeOutMove锛氳繍鍔ㄨ秴鏃讹紝鍗曚綅姣")] + public int TimeOutMove { get; set; } = 10000; + + [Category("寮�闂幆璁剧疆")] + [DisplayName("鏄惁浣跨敤Cmmd鍥為")] + [Description("IsUseCmmdPosition锛氭槸鍚︿娇鐢–mmd鍥為")] + public bool IsUseCmmdPosition { get; set; } = false; + + [Category("寮�闂幆璁剧疆")] + [DisplayName("鏄惁浣跨敤鏉垮崱鍙嶉鍋滄淇″彿")] + [Description("IsUseMDNStopSignal锛氭槸鍚︿娇鐢ㄦ澘鍗″弽棣堝仠姝俊鍙�")] + public bool IsUseMDNStopSignal { get; set; } = false; + + [Category("寮�闂幆璁剧疆")] + [DisplayName("鏄惁鍚敤鎶ヨ")] + [Description("IsUseWarning锛氭槸鍚﹀惎鐢ㄦ姤璀�")] + public bool IsUseWarning { get; set; } = false; + + [Category("鏆傚仠閰嶇疆")] + [DisplayName("鏄惁鍚敤绔嬪嵆鏆傚仠")] + [Description("IsImmediatePause锛氭槸鍚﹀惎鐢ㄧ珛鍗虫殏鍋�")] + public bool IsImmediatePause { get; set; } = false; + + [Category("鏆傚仠閰嶇疆")] + [DisplayName("杞翠綅缃浜庡尯闂村唴鏃堕�傜敤鐨勬殏鍋滄搷浣�")] + [Description("ImmediatePauseSections锛氬綋杞翠綅缃浜庡尯闂村唴鏃堕�傜敤鐨勬殏鍋滄搷浣�")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<Section>), typeof(UITypeEditor))] + public List<Section> ImmediatePauseSections { get; set; } = new List<Section>(); + + public string GetDisplayText() + { + return AxisIndex + "-" + AxisName + "-" + (IsAxisEnabled ? "鍚敤" : "绂佺敤"); + } } - public static class GTSCardParameter + /// <summary> + /// 浣嶇疆瀵硅薄 + /// </summary> + public class Section : IComplexDisplay { - #region 杩愬姩鍙傛暟 - public static int Dangliang = 1; - public static int AxisCount = 2;//杩愬姩杞存暟閲� - public static short CardNum = Convert.ToInt16(ConfigurationManager.AppSettings["cardNum"]); - public static short fifo = Convert.ToInt16(ConfigurationManager.AppSettings["fifo"]); - public static int FlySpeed = Convert.ToInt32(ConfigurationManager.AppSettings["flySpeed"]); - public static double FlyAcc = Convert.ToDouble(ConfigurationManager.AppSettings["flyAcc"]); - public static int P2PSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["p2pSpeed"]); - public static double P2PAcc = Convert.ToDouble(ConfigurationManager.AppSettings["p2pAcc"]); - public static double P2PDec = Convert.ToDouble(ConfigurationManager.AppSettings["p2pDec"]); - public static int FreeSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["freeSpeed"]); - public static int VelEnd = Convert.ToInt32(ConfigurationManager.AppSettings["velEnd"]);//椋炴媿缁撴潫閫熷害 - public static int HomeSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["homeSpeed"]); - public static int Loading = Convert.ToInt32(ConfigurationManager.AppSettings["loading"]); - //public const short cardn = 0;//杩愬姩鎺у埗鍣ㄥ崱鍙� 榛樿涓猴細0 - //public const short crdn = 1;//鍧愭爣绯诲彿 鍙栧�艰寖鍥达細[1, 2] - //public const short fifo = 0;//鎻掕ˉ缂撳瓨鍖哄彿 鍙栧�艰寖鍥达細[0, 1]锛岄粯璁ゅ�间负锛�0 - //public const int flySpeed = 250;//椋炴媿閫熷害 - //public const double flyAcc = 0.5;//椋炴媿鍔犻�熷害 - //public const int gocatorSpeed = 150;//3D妫�娴嬭酱杩愬姩閫熷害 - //public const int p2pSpeed = 250;//P2P閫熷害 - //public const double p2pAcc = 1;//P2P鍔犻�熷害 - //public const double p2pDec = 1;//P2P鍑忛�熷害 - //public const int calibrationSpeed = 10;//鏍囧畾閫熷害 - //public const int calibrationZ = 19336;//鏍囧畾Z杞撮珮搴� - //public const int barcodeSpeed = 250;//鏉$爜妫�娴嬭酱杩愬姩閫熷害 - //public const int freeSpeed = 250;//闈炴娴嬫椂杞磋繍鍔ㄩ�熷害 - //public const int velEnd = 0;//椋炴媿缁撴潫閫熷害 - //public const int homeSpeed = 50;//鍥為浂閫熷害 - //public const int loading = 80000;//涓婃枡浣嶇疆 - #endregion + [Category("鏆傚仠鍖洪棿")] + [DisplayName("璧峰浣嶇疆")] + [Description("StartPosition锛氳捣濮嬩綅缃�")] + public int StartPosition { get; set; } - #region IO - /// <summary> - /// 杈撳叆IO榛樿鍊� - /// </summary> - public const int InDefaultValue = 0xFFDA; - /// <summary> - /// 澶圭揣姘旂几 - /// </summary> - public const short EXO_1 = 100;//澶圭揣姘旂几 - /// <summary> - /// 鏃ュ厜鐏� - /// </summary> - public const short EXO_2 = 101;//鏃ュ厜鐏� - /// <summary> - /// 鍏夋簮鍒囨崲 - /// </summary> - public const short EXO_3 = 102;//鍏夋簮鍒囨崲 - /// <summary> - /// 绾㈢伅 - /// </summary> - public const short EXO_4 = 103;//绾㈢伅 - /// <summary> - /// 榛勭伅 - /// </summary> - public const short EXO_5 = 104;//榛勭伅 - /// <summary> - /// 缁跨伅 - /// </summary> - public const short EXO_6 = 105;//缁跨伅 - /// <summary> - /// 铚傞福鍣� - /// </summary> - public const short EXO_7 = 106;//铚傞福鍣� - /// <summary> - /// Gocator X - /// </summary> - public const short EXO_8 = 107;//Gocator X + [Category("鏆傚仠鍖洪棿")] + [DisplayName("缁撴潫浣嶇疆")] + [Description("EndPosition锛氱粨鏉熶綅缃�")] + public int EndPosition { get; set; } - /// <summary> - /// 姝i潰鍏�(宸�) - /// </summary> - public const short EXO_9 = 108;//姝i潰鍏�(宸�) - - /// <summary> - /// 姝i潰鍏�(鍚�) - /// </summary> - public const short EXO_10 = 109;//姝i潰鍏�(鍚�) - - /// <summary> - /// 姝i潰鍏�(鍙�) - /// </summary> - public const short EXO_11 = 110;//姝i潰鍏�(鍙�) - - /// <summary> - /// 姝i潰鍏�(鍓�) - /// </summary> - public const short EXO_12 = 111;//姝i潰鍏�(鍓�) - - /// <summary> - /// Gocator Y - /// </summary> - public const short EXO_16 = 115;//Gocator Y - - /// <summary> - /// 杈撳嚭IO榛樿鍊� - /// </summary> - public const int OutDefaultValue = 0xFFF; - /// <summary> - /// 宸﹀惎鍔� - /// </summary> - public const short EXI0 = 0;//宸﹁捣鍔� - /// <summary> - /// 鍙冲惎鍔� - /// </summary> - public const short EXI1 = 1;//鍙宠捣鍔� - /// <summary> - /// 鍋滄 - /// </summary> - public const short EXI2 = 2;//鍋滄 - /// <summary> - /// 澶嶄綅 - /// </summary> - public const short EXI3 = 3;//澶嶄綅 - /// <summary> - /// 鎬ュ仠 - /// </summary> - public const short EXI4 = 4;//鎬ュ仠 - /// <summary> - /// 闂ㄥ紑鍏� - /// </summary> - public const short EXI5 = 5;//闂ㄥ紑鍏� - /// <summary> - /// 瀹夊叏鍏夊箷 - /// </summary> - public const short EXI6 = 6;//瀹夊叏鍏夊箷 - - public const short EXI7 = 7;// - /// <summary> - /// 澶圭揣姘旂几鍘熶綅 - /// </summary> - public const short EXI8 = 8;//澶圭揣姘旂几鍘熶綅 - /// <summary> - /// 澶圭揣姘旂几鍒颁綅 - /// </summary> - public const short EXI9 = 9;//澶圭揣姘旂几鍒颁綅 - #endregion + public string GetDisplayText() + { + return $"{StartPosition}--{EndPosition}"; + } } + + /// <summary> + /// 閫熷害鍙傛暟瀵硅薄 + /// </summary> + public class VelocityPara + { + [Category("閫熷害閰嶇疆")] + [DisplayName("閫熷害")] + [Description("Velocity锛氶�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")] + public double Velocity { get; set; } = 0; + + [Category("閫熷害閰嶇疆")] + [DisplayName("鍔犻�熷害")] + [Description("Acc锛氬姞閫熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆")] + public double Acc { get; set; } = 0; + + [Category("閫熷害閰嶇疆")] + [DisplayName("鍑忛�熷害")] + [Description("鍑忛�熷害,涓�0鏃惰〃绀轰笉淇敼褰撳墠璁剧疆銆傚洖鍘熺偣妯″紡鏃惰缃负鏇茬嚎鍙傛暟")] + public double Dec { get; set; } = 0; + } + + /// <summary> + /// 杩愬姩瀵硅薄 + /// </summary> + public class MovingOption : INotifyPropertyChanged, IComplexDisplay + { + private int axisIndex = 0; + [Category("杩愬姩閰嶇疆")] + [DisplayName("杩愬姩杞寸储寮�")] + [Description("AxisIndex锛氳繍鍔ㄨ酱绱㈠紩")] + [TypeConverter(typeof(AxisIndexConvert))] + public int AxisIndex + { + get => axisIndex; + set + { + if (axisIndex != value) + { + axisIndex = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("AxisIndex")); + } + axisIndex = value; + } + } + + private MotorMoveMode moveMode = MotorMoveMode.Normal; + [Category("杩愬姩閰嶇疆")] + [DisplayName("杩愬姩妯″紡")] + [Description("MoveMode锛氳繍鍔ㄦā寮�")] + public MotorMoveMode MoveMode + { + get => moveMode; + set + { + if (moveMode != value) + { + moveMode = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MoveMode")); + } + + moveMode = value; + } + } + + private bool isAbsolute = true; + [Category("杩愬姩閰嶇疆")] + [DisplayName("鏄惁缁濆杩愬姩")] + [Description("IsAbsolute锛氭槸鍚︾粷瀵硅繍鍔�")] + public bool IsAbsolute + { + get => isAbsolute; + set + { + if (isAbsolute != value) + { + isAbsolute = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsAbsolute")); + } + + isAbsolute = value; + } + } + + private int destination = 0; + [Category("杩愬姩閰嶇疆")] + [DisplayName("鐩殑鍦�")] + [Description("Destination锛氱洰鐨勫湴")] + public int Destination + { + get => destination; + set + { + if (destination != value) + { + destination = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Destination")); + } + + destination = value; + } + } + + private VelocityPara velocityPara = new VelocityPara(); + [Category("杩愬姩閰嶇疆")] + [DisplayName("閫熷害鍙傛暟")] + [Description("VelocityPara锛氶�熷害鍙傛暟")] + [TypeConverter(typeof(ComplexObjectConvert))] + [Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))] + public VelocityPara VelocityPara + { + get => velocityPara; + set + { + velocityPara = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("VelocityPara")); + } + } + + internal List<AxisSetting> _axisSettingList = new List<AxisSetting>(); + public void SetAxisSetting(List<AxisSetting> settings) + { + if (settings != null) + _axisSettingList = settings; + } + + public string GetDisplayText() + { + string axisName = AxisIndex.ToString(); + var axisSet = _axisSettingList.FirstOrDefault(a => a.AxisIndex == AxisIndex); + if (axisSet != null) + { + axisName += ("-" + axisSet.AxisName); + } + return axisName + "," + MoveMode.ToString() + "," + (IsAbsolute ? "Abs" : "Rel") + "," + Destination; + } + public event PropertyChangedEventHandler PropertyChanged; + } + + public class AxisIndexConvert : TypeConverter + { + Dictionary<int, string> _indexNameDict = new Dictionary<int, string>(); + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + { + MovingOption mo = context.Instance as MovingOption; + + _indexNameDict = mo._axisSettingList.ToDictionary(a => a.AxisIndex, a => a.AxisIndex + "-" + a.AxisName); + + return new StandardValuesCollection(_indexNameDict.Keys); + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object v) + { + if (v is string) + { + foreach (var indexName in _indexNameDict) + { + if (indexName.Value == v.ToString()) + { + return indexName.Key; + } + } + return Convert.ToInt32(v); + } + return base.ConvertFrom(context, culture, v); + } + + public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object v, Type destinationType) + { + if (destinationType == typeof(string)) + { + if (_indexNameDict.ContainsKey(Convert.ToInt32(v))) + { + return _indexNameDict[Convert.ToInt32(v)]; + } + } + return base.ConvertTo(context, culture, v, destinationType); + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { + return false; + } + } + + public class AxisConflictSet : IComplexDisplay + { + [Category("1.杞村啿绐佹潯浠�")] + [Description("杞村啿绐佹潯浠讹紝婊¤冻鍏ㄩ儴鏉′欢鏃惰酱杩愬姩闇�瑕佹鏌ュ啿绐�")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<AxisLimit>), typeof(UITypeEditor))] + public List<AxisLimit> AxisOptions { get; set; } = new List<AxisLimit>(); + + [Category("1.杞村啿绐佹潯浠�")] + [Description("IO鍐茬獊鏉′欢锛屾弧瓒冲叏閮ㄦ潯浠舵椂杞磋繍鍔ㄩ渶瑕佹鏌ュ啿绐�")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<IOLimit>), typeof(UITypeEditor))] + public List<IOLimit> IOOptions { get; set; } = new List<IOLimit>(); + + [Category("2.杞村啿绐侀檺鍒�")] + [Description("杞村啿绐侀檺鍒讹紝杞磋繍鍔ㄥ厑璁稿尯闂�")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<AxisLimit>), typeof(UITypeEditor))] + public List<AxisLimit> AxisLimits { get; set; } = new List<AxisLimit>(); + + [Category("2.杞村啿绐侀檺鍒�")] + [Description("IO鍏佽鏉′欢锛屽厑璁歌緭鍑虹殑IO")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<IOLimit>), typeof(UITypeEditor))] + public List<IOLimit> IOOutputs { get; set; } = new List<IOLimit>(); + + [Category("3.杞村啿绐佸惎鐢�")] + [Description("true锛氬惎鐢ㄨ酱鍐茬獊闄愬埗 false锛氫笉鍚敤杞村啿绐侀檺鍒�")] + public bool IsEnabled { get; set; } = true; + + public string GetDisplayText() + { + string optionStr = "Options:" + String.Join(";", AxisOptions.Select(a => a.GetDisplayText())); + string limitStr = "Limits:" + String.Join(";", AxisLimits.Select(a => a.GetDisplayText())); + + return optionStr + "|" + limitStr; + } + } + + public class AxisLimit : IComplexDisplay + { + [Category("1.杞村彿")] + [Description("1.杞村彿")] + public int AxisIndex { get; set; } + + [Category("2.杞存渶灏忛檺鍒�")] + [Description("2.杞存渶灏忛檺鍒�")] + public int LimitMin { get; set; } + + [Category("3.杞存渶澶ч檺鍒�")] + [Description("3.杞存渶澶ч檺鍒�")] + public int LimitMax { get; set; } + + private int currentPosition = 0; + [Browsable(false)] + [JsonIgnore] + public int CurrentPosition + { + get => currentPosition; + set + { + if (currentPosition != value) + { + if (value >= LimitMin && value <= LimitMax) + { + IsInLimit = true; + } + else + { + IsInLimit = false; + } + } + + currentPosition = value; + } + } + + [Browsable(false)] + [JsonIgnore] + public bool IsInLimit { get; set; } + + public string GetDisplayText() + { + return String.Format("Index:{0},{1}->{2}", AxisIndex, LimitMin, LimitMax); + } + } + + public class IOLimit : IComplexDisplay + { + [Category("1.IO闄愬埗")] + [Description("IO绱㈠紩")] + public int IOIndex { get; set; } + + [Category("1.IO闄愬埗")] + [Description("IO闄愬埗鍊笺�傝緭鍏ュ垽鏂椂璇ュ�间綔涓哄惎鐢ㄥ垽鏂�硷紝杈撳嚭鍒ゆ柇鏃惰鍊间綔涓哄厑璁歌緭鍑哄��")] + public bool IOSignal { get; set; } + + public string GetDisplayText() + { + return IOIndex + "--" + IOSignal.ToString(); + } + } + + public class AxisMovingStay + { + public int Position { get; set; } + + public int Velocity { get; set; } + + public AutoResetEvent MoveHandle { get; set; } = new AutoResetEvent(false); + + public AutoResetEvent MoveSendHandle { get; set; } = new AutoResetEvent(false); + } + + ///// <summary> + ///// 鐐逛綅绫诲瀷 + ///// </summary> + //public enum PosType + //{ + // /// <summary> + // /// 鐩寸嚎鎻掕ˉ + // /// </summary> + // Line = 1, + // /// <summary> + // /// 鍦嗗姬鎻掕ˉ(鍗婂緞) + // /// </summary> + // CircleRadius, + // /// <summary> + // /// 鍦嗗姬鎻掕ˉ(鍦嗗績) + // /// </summary> + // CircleCenter + //} + + + //public static class GTSCardParameter + //{ + // #region 杩愬姩鍙傛暟 + // public static int Dangliang = 1; + // public static int AxisCount = 2;//杩愬姩杞存暟閲� + // public static short CardNum = Convert.ToInt16(ConfigurationManager.AppSettings["cardNum"]); + // public static short fifo = Convert.ToInt16(ConfigurationManager.AppSettings["fifo"]); + // public static int FlySpeed = Convert.ToInt32(ConfigurationManager.AppSettings["flySpeed"]); + // public static double FlyAcc = Convert.ToDouble(ConfigurationManager.AppSettings["flyAcc"]); + // public static int P2PSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["p2pSpeed"]); + // public static double P2PAcc = Convert.ToDouble(ConfigurationManager.AppSettings["p2pAcc"]); + // public static double P2PDec = Convert.ToDouble(ConfigurationManager.AppSettings["p2pDec"]); + // public static int FreeSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["freeSpeed"]); + // public static int VelEnd = Convert.ToInt32(ConfigurationManager.AppSettings["velEnd"]);//椋炴媿缁撴潫閫熷害 + // public static int HomeSpeed = Convert.ToInt32(ConfigurationManager.AppSettings["homeSpeed"]); + // public static int Loading = Convert.ToInt32(ConfigurationManager.AppSettings["loading"]); + // //public const short cardn = 0;//杩愬姩鎺у埗鍣ㄥ崱鍙� 榛樿涓猴細0 + // //public const short crdn = 1;//鍧愭爣绯诲彿 鍙栧�艰寖鍥达細[1, 2] + // //public const short fifo = 0;//鎻掕ˉ缂撳瓨鍖哄彿 鍙栧�艰寖鍥达細[0, 1]锛岄粯璁ゅ�间负锛�0 + // //public const int flySpeed = 250;//椋炴媿閫熷害 + // //public const double flyAcc = 0.5;//椋炴媿鍔犻�熷害 + // //public const int gocatorSpeed = 150;//3D妫�娴嬭酱杩愬姩閫熷害 + // //public const int p2pSpeed = 250;//P2P閫熷害 + // //public const double p2pAcc = 1;//P2P鍔犻�熷害 + // //public const double p2pDec = 1;//P2P鍑忛�熷害 + // //public const int calibrationSpeed = 10;//鏍囧畾閫熷害 + // //public const int calibrationZ = 19336;//鏍囧畾Z杞撮珮搴� + // //public const int barcodeSpeed = 250;//鏉$爜妫�娴嬭酱杩愬姩閫熷害 + // //public const int freeSpeed = 250;//闈炴娴嬫椂杞磋繍鍔ㄩ�熷害 + // //public const int velEnd = 0;//椋炴媿缁撴潫閫熷害 + // //public const int homeSpeed = 50;//鍥為浂閫熷害 + // //public const int loading = 80000;//涓婃枡浣嶇疆 + // #endregion + + // #region IO + // /// <summary> + // /// 杈撳叆IO榛樿鍊� + // /// </summary> + // public const int InDefaultValue = 0xFFDA; + // /// <summary> + // /// 澶圭揣姘旂几 + // /// </summary> + // public const short EXO_1 = 100;//澶圭揣姘旂几 + // /// <summary> + // /// 鏃ュ厜鐏� + // /// </summary> + // public const short EXO_2 = 101;//鏃ュ厜鐏� + // /// <summary> + // /// 鍏夋簮鍒囨崲 + // /// </summary> + // public const short EXO_3 = 102;//鍏夋簮鍒囨崲 + // /// <summary> + // /// 绾㈢伅 + // /// </summary> + // public const short EXO_4 = 103;//绾㈢伅 + // /// <summary> + // /// 榛勭伅 + // /// </summary> + // public const short EXO_5 = 104;//榛勭伅 + // /// <summary> + // /// 缁跨伅 + // /// </summary> + // public const short EXO_6 = 105;//缁跨伅 + // /// <summary> + // /// 铚傞福鍣� + // /// </summary> + // public const short EXO_7 = 106;//铚傞福鍣� + // /// <summary> + // /// Gocator X + // /// </summary> + // public const short EXO_8 = 107;//Gocator X + + // /// <summary> + // /// 姝i潰鍏�(宸�) + // /// </summary> + // public const short EXO_9 = 108;//姝i潰鍏�(宸�) + + // /// <summary> + // /// 姝i潰鍏�(鍚�) + // /// </summary> + // public const short EXO_10 = 109;//姝i潰鍏�(鍚�) + + // /// <summary> + // /// 姝i潰鍏�(鍙�) + // /// </summary> + // public const short EXO_11 = 110;//姝i潰鍏�(鍙�) + + // /// <summary> + // /// 姝i潰鍏�(鍓�) + // /// </summary> + // public const short EXO_12 = 111;//姝i潰鍏�(鍓�) + + // /// <summary> + // /// Gocator Y + // /// </summary> + // public const short EXO_16 = 115;//Gocator Y + + // /// <summary> + // /// 杈撳嚭IO榛樿鍊� + // /// </summary> + // public const int OutDefaultValue = 0xFFF; + // /// <summary> + // /// 宸﹀惎鍔� + // /// </summary> + // public const short EXI0 = 0;//宸﹁捣鍔� + // /// <summary> + // /// 鍙冲惎鍔� + // /// </summary> + // public const short EXI1 = 1;//鍙宠捣鍔� + // /// <summary> + // /// 鍋滄 + // /// </summary> + // public const short EXI2 = 2;//鍋滄 + // /// <summary> + // /// 澶嶄綅 + // /// </summary> + // public const short EXI3 = 3;//澶嶄綅 + // /// <summary> + // /// 鎬ュ仠 + // /// </summary> + // public const short EXI4 = 4;//鎬ュ仠 + // /// <summary> + // /// 闂ㄥ紑鍏� + // /// </summary> + // public const short EXI5 = 5;//闂ㄥ紑鍏� + // /// <summary> + // /// 瀹夊叏鍏夊箷 + // /// </summary> + // public const short EXI6 = 6;//瀹夊叏鍏夊箷 + + // public const short EXI7 = 7;// + // /// <summary> + // /// 澶圭揣姘旂几鍘熶綅 + // /// </summary> + // public const short EXI8 = 8;//澶圭揣姘旂几鍘熶綅 + // /// <summary> + // /// 澶圭揣姘旂几鍒颁綅 + // /// </summary> + // public const short EXI9 = 9;//澶圭揣姘旂几鍒颁綅 + // #endregion + //} } diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs index a51429e..03b4c15 100644 --- a/src/Bro.Device.GTSCard/GTSCardDriver.cs +++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs @@ -1,27 +1,101 @@ 锘縰sing Bro.Common.Base; +using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; using System; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Drawing; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace Bro.Device.GTSCard { - public class GTSCardDriver : DeviceBase,IMonitor, IMotion + [Device("GTSCard", "鍥洪珮鏉垮崱", EnumHelper.DeviceAttributeType.Device)] + public class GTSCardDriver : DeviceBase, IMonitor, IMotion { public event Action<DateTime, string, IDevice, MonitorSet> OnMonitorInvoke; public event Action<DateTime, IDevice, WarningSet> OnMonitorAlarm; + + public delegate bool OnAxisStartToCheckDelegate(int axisIndex, int startPosition, int endPosition); + // 寮傚父浜嬩欢 + public Action<Exception> OnExceptionRaised; + + public GTSCardInitialConfig IConfig + { + get + { + return InitialConfig as GTSCardInitialConfig; + } + } + + static Dictionary<int, object> axisMoveLockDict = new Dictionary<int, object>(); + + /// <summary> + /// 杞磋繍鍔ㄥ紑濮嬫椂鐨勬娴嬶紝true:鏈夊啿绐� 涓嶅彲缁х画鎵ц false锛氭棤鍐茬獊,鍙户缁墽琛� + /// </summary> + public event OnAxisStartToCheckDelegate OnAxisStartToCheckConfliction; + /// <summary> + /// 鏆傚仠锛堢嚎绋嬪悓姝ヤ簨浠讹級 + /// </summary> + Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>(); + Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>(); + /// <summary> + /// 杩愯杩囩▼涓殑绾跨▼绛夊緟 + /// </summary> + private Dictionary<int, ManualResetEvent> runningEventDic = new Dictionary<int, ManualResetEvent>(); + private Dictionary<int, AutoResetEvent> axisMovingHandleDict = new Dictionary<int, AutoResetEvent>(); + private ConcurrentDictionary<int, int> axisDestination = new ConcurrentDictionary<int, int>(); + + private ObservableCollection<int> _commandAxisList = new ObservableCollection<int>(); + public Action<bool> CommandAxisCountChangedAction = null; + private Dictionary<int, VelocityPara> velIndexDict = new Dictionary<int, VelocityPara>(); + ManualResetEvent _pauseHandle = new ManualResetEvent(true); + + static object lockObj = new object(); + static object _commandAxisLock = new object(); + /// <summary> + /// 鏄惁澶嶄綅鏍囧織 + /// </summary> + bool _isResetting = false; + + public void SetResetFlag(bool isReset) + { + _isResetting = isReset; + } public List<AxisInfo> GetCurrentAxisInfo(params string[] axisName) { throw new NotImplementedException(); } + #region DeviceBase + protected override void Init() { - throw new NotImplementedException(); + InitialMotionCard((short)IConfig.CardNum, IConfig.InitialConfigFilePath); + + axisMoveLockDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new object()); + runningEventDic = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(false)); + axisMovingHandleDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new AutoResetEvent(true)); + axisImmediatePauseHandleDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(true)); + axisMoveCancelDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new CancellationTokenSource()); + + axisMoveCancelDict.Values.ToList().ForEach(c => + { + c = new CancellationTokenSource(); + }); + + _commandAxisList.CollectionChanged -= CommandAxisList_CollectionChanged; + _commandAxisList.CollectionChanged += CommandAxisList_CollectionChanged; + } + + private void CommandAxisList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + CommandAxisCountChangedAction?.Invoke(_commandAxisList.Count > 0); } protected override void Pause() @@ -43,43 +117,874 @@ { throw new NotImplementedException(); } + #endregion - /// <summary> - /// 鐐逛綅鍒扮偣浣� 杩愬姩 - /// </summary> - /// <param name="cardNum">鍗″彿</param> - /// <param name="axisNum">杞村彿</param> - /// <param name="prfPosition">瑙勫垝浣嶇疆,鍗曚綅姣背</param> - /// <param name="prfVelocity">瑙勫垝閫熷害,鍗曚綅绫虫瘡绉�</param> - public void P2P(short cardNum, short axisNum, int prfPosition, int prfVelocity) + #region GTSCard + + public void ClearPosition(short cardNum, short axisNum) { - GTSCardAPI.TTrapPrm trapprm; - GTSCardAPI.GT_PrfTrap(cardNum, axisNum); - GTSCardAPI.GT_GetTrapPrm(cardNum, axisNum, out trapprm); - trapprm.acc = GTSCardParameter.P2PAcc; - trapprm.dec = GTSCardParameter.P2PDec; - trapprm.smoothTime = 1; - GTSCardAPI.GT_SetTrapPrm(cardNum, axisNum, ref trapprm); - GTSCardAPI.GT_SetPos(cardNum, axisNum, prfPosition * GTSCardParameter.Dangliang); - GTSCardAPI.GT_SetVel(cardNum, axisNum, prfVelocity * GTSCardParameter.Dangliang); - GTSCardAPI.GT_Update(cardNum, 1 << (axisNum - 1)); + int ret = GTSCardAPI.GT_SetPos(cardNum, axisNum, 0); } /// <summary> - /// Jog杩愬姩 + /// Load Motion Card parameter from file /// </summary> - /// <param name="cardNum"></param> - /// <param name="axisNum"></param> - /// <param name="velocity">瑙勫垝閫熷害锛屽崟浣嶇背姣忕</param> - public void Jog(short cardNum, short axisNum, double velocity) + /// <param name="fileName">Invalid Parameter</param> + /// <returns></returns> + public void InitialMotionCard(short cardNum, string fileName) + { + var res = GTSCardAPI.GT_LoadConfig(cardNum, fileName); + if (res != GTSCardAPI.ResultSuccess) + { + throw new Exception("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res); + } + + } + + /// <summary> + /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔紙寮傛锛� + /// </summary> + /// <param name="item">杩愬姩瀵硅薄</param> + /// <returns></returns> + public async Task SingleAxisMovingAsync(MovingOption item) + { + await Task.Run(() => + { + SingleAxisMoving(item); + }); + } + + /// <summary> + /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔紙寮傛锛� + /// </summary> + /// <param name="item">杩愬姩瀵硅薄</param> + public void SingleAxisMoving(MovingOption item) + { + if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == item.AxisIndex)?.IsAxisEnabled ?? false) + { + axisImmediatePauseHandleDict[item.AxisIndex].WaitOne(); + VelocityPara vel = new VelocityPara(); + if (item.VelocityPara.Velocity != 0) + { + velIndexDict[item.AxisIndex] = vel = item.VelocityPara; + } + else + { + vel = velIndexDict[item.AxisIndex]; + } + + string _position = ""; + string motionType = item.MoveMode == EnumHelper.MotorMoveMode.Normal ? (item.IsAbsolute ? "Abs" : "Rel") : item.MoveMode.ToString(); + + _position = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{item.AxisIndex},{motionType},{GetCmdOrPosition(item.AxisIndex, 0).ToString()},{GetCmdOrPosition(item.AxisIndex, 1).ToString()},{item.Destination},"; + + lock (axisMoveLockDict[item.AxisIndex]) + { + Task.Run(() => + { + lock (_commandAxisLock) + { + try + { + if (!_commandAxisList.Contains(item.AxisIndex)) + { + _commandAxisList.Add(item.AxisIndex); + } + } + catch (Exception) + { + } + } + }); + + switch (item.MoveMode) + { + case EnumHelper.MotorMoveMode.Normal: + { + if (_isResetting) + { + LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", item.AxisIndex + "鍚姩杩愬姩寮傚父"); + return; + } + + SetAxisParam(item.AxisIndex, vel); + if (item.IsAbsolute) + { + MoveAbs(item.AxisIndex, item.Destination, (int)(vel.Velocity * IConfig.AxisVelocityRatio)); + } + else + { + MoveRel(item.AxisIndex, item.Destination, (int)(vel.Velocity * IConfig.AxisVelocityRatio)); + } + } + break; + case EnumHelper.MotorMoveMode.FindOri: + { + AxisSetting setting = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == item.AxisIndex); + StartHoming(item.AxisIndex, setting.HomeMode, setting.IsHomePositive ? 1 : 0, item.VelocityPara.Dec, item.VelocityPara.Acc, item.VelocityPara.Velocity); + } + break; + } + + Task.Run(() => + { + lock (_commandAxisLock) + { + try + { + _commandAxisList.Remove(item.AxisIndex); + } + catch (Exception) + { + } + } + }); + } + + _position += $"{GetCmdOrPosition(item.AxisIndex, 0).ToString()},"; + _position += $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"; + LogAsync(DateTime.Now, "", _position); + } + } + + public int GetCmdOrPosition(int axisNum, int flag = 0) + { + int position = 0; + + if (flag == 0) + { + GetPosition(axisNum, ref position); + } + else + { + GetCmdPosition(axisNum, ref position); + } + + return position; + } + + /// <summary> + ///Get single Axis Feedback position + /// </summary> + /// <param name="axisNum">Axis number</param> + /// <param name="nPosition">Feedback/Encorde position </param> + /// <returns></returns> + public void GetPosition(int axisNum, ref int nPosition) + { + lock (lockObj) + { + double prfpos = 0; uint pclock = 0; + var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out prfpos, 1, out pclock); + if (ret != GTSCardAPI.ResultSuccess) + { + throw new Exception("杞�" + axisNum + "鑾峰彇褰撳墠浣嶇疆寮傚父锛岄敊璇爜锛�" + ret); + } + nPosition = prfpos / IConfig.AxisVelocityRatio; + } + } + + public int GetPosition(int axisNum) + { + int position = 0; + + if (!IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).IsUseCmmdPosition) + { + GetPosition(axisNum, ref position); + } + else + { + GetCmdPosition(axisNum, ref position); + } + + return position; + } + + /// <summary> + ///Get single Axis Command position + /// </summary> + /// <param name="axisNum">Axis number</param> + /// <param name="nPosition">Command position </param> + /// <returns></returns> + public void GetCmdPosition(int axisNum, ref int nPosition) + { + var ret = GTSCardAPI.APS_get_command(axisNum, ref nPosition); + if (ret != (Int32)GTSCardParameter.ResultSuccess) + { + throw new Exception("杞�" + axisNum + "鑾峰彇褰撳墠浣嶇疆寮傚父锛岄敊璇爜锛�" + ret); + } + nPosition = prfpos / IConfig.AxisVelocityRatio; + } + + /// <summary> + /// Set AxisParam + /// </summary> + /// <param name="axisNo"></param> + /// <param name="param"></param> + /// <returns></returns> + public void SetAxisParam(int axisNum, VelocityPara param) + { + int ret = 0; + GTSCardAPI.TTrapPrm trapprm; + GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)axisNum); + GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)axisNum, out trapprm); + trapprm.smoothTime = 1; + if (param.Acc != 0) + { + trapprm.acc = param.Acc; + } + if (param.Dec != 0) + { + trapprm.dec = param.Dec; + } + ret += GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, (short)axisNum, ref trapprm); + ret += GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, param.Velocity * IConfig.AxisVelocityRatio); + + if (ret != (int)APS_Define.ResultSuccess) + { + throw new Exception("杞�" + axisNum + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + ret); + } + } + + /// <summary> + /// Set Single Axis Do Jog Move + /// </summary> + /// <param name="axisNum">AxisNo</param> + /// <param name="nDirection">Motion Direction 0: Negative, 1: Positive</param> + /// <param name="nMaxVel">max velocity</param> + /// <returns></returns> + public bool StartJog(int axisNum, int nDirection, int velocity) { GTSCardAPI.TJogPrm jogprm = new GTSCardAPI.TJogPrm(); - short rtn = GTSCardAPI.GT_PrfJog(cardNum, axisNum); + short rtn = GTSCardAPI.GT_PrfJog((short)IConfig.CardNum, (short)axisNum); jogprm.acc = 1; jogprm.dec = 1; - GTSCardAPI.GT_SetJogPrm(cardNum, axisNum, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟 - GTSCardAPI.GT_SetVel(cardNum, axisNum, velocity);//璁剧疆鐩爣閫熷害 - GTSCardAPI.GT_Update(cardNum, 1 << (axisNum - 1));//鏇存柊杞磋繍鍔� + GTSCardAPI.GT_SetJogPrm((short)IConfig.CardNum, (short)axisNum, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟 + GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, velocity);//璁剧疆鐩爣閫熷害 + int ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));//鏇存柊杞磋繍鍔� + + if (ret != (int)APS_Define.ResultSuccess) + { + return false; + } + return true; + } + + /// <summary> + /// Set Single Axis Do stop Jog Move + /// </summary> + /// <param name="axisNum">AxisNo</param> + /// <returns></returns> + public bool StopJog(int axisNum) + { + MoveStop(); + return IsStop((short)IConfig.CardNum, (short)axisNum); + } + + /// <summary> + /// Set Single Axis Do Rel Move + /// </summary> + /// <param name="axisNum">AxisNo</param> + /// <param name="nDistance">run distance</param> + /// <returns></returns> + public void MoveRel(int axisNum, int nDistance, int nMaxVel) + { + try + { + if (CurrentState == EnumHelper.DeviceState.DSExcept) + { + LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + axisNum + "璇曞浘寮傚父鐘舵�佽繍鍔�"); + return; + } + + if (CurrentState != EnumHelper.DeviceState.DSOpen) + { + return; + } + + int currentPosition = GetPosition(axisNum); + + if (OnAxisStartToCheckConfliction != null && OnAxisStartToCheckConfliction.Invoke(axisNum, currentPosition, currentPosition + nDistance)) + { + return; + } + + int ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)axisNum, nDistance * IConfig.AxisVelocityRatio); + + ret += GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1)); + if (ret != (Int32)APS_Define.ResultSuccess) + { + throw new Exception("杞�" + axisNum + "鍚姩鐩稿杩愬姩寮傚父锛岄敊璇爜锛�" + ret); + } + + RunFinish(axisNum, false); + } + catch (Exception ex) + { + MoveStop(); + OnExceptionRaised?.Invoke(ex); + } + } + + /// <summary> + /// Set Single Axis Do Absolute Move + /// </summary> + /// <param name="axisNum">AxisNo</param> + /// <param name="nDistance">run distance</param> + /// <param name="nMaxVel">max velocity</param> + /// <returns></returns> + public void MoveAbs(int axisNum, int nPosition, int nMaxVel) + { + try + { + ReMove: + MoveAbsAsync(axisNum, nPosition); + + var runFinish = Task.Run(() => RunFinish(axisNum), axisMoveCancelDict[axisNum].Token); + try + { + runFinish.Wait(axisMoveCancelDict[axisNum].Token); + } + catch (OperationCanceledException ex) + { + goto ReMove; + } + + //// 鍒犻櫎璁板綍 + //if (currentCommandDic.ContainsKey(axisNum)) + //{ + // currentCommandDic.TryRemove(axisNum, out int[] temp); + //} + } + catch (Exception ex) + { + MoveStop(); + OnExceptionRaised?.Invoke(ex); + } + } + + static object moveLock = new object(); + + /// <summary> + /// 缁濆杩愬姩锛堝紓姝ワ級 + /// </summary> + /// <param name="axisNum"></param> + /// <param name="nPosition"></param> + public void MoveAbsAsync(int axisNum, int nPosition) + { + try + { + lock (moveLock) + { + axisImmediatePauseHandleDict[axisNum].WaitOne(); + _pauseHandle.WaitOne(); + + int currentPosition = GetPosition(axisNum); + if (OnAxisStartToCheckConfliction != null && OnAxisStartToCheckConfliction.Invoke(axisNum, currentPosition, nPosition)) + { + return; + } + + if (_isResetting) + { + LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + axisNum + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); + throw new Exception("杞�" + axisNum + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩"); + } + + int repeatTime = 30; + while (CurrentState != EnumHelper.DeviceState.DSOpen && repeatTime > 0) + { + Thread.Sleep(10); + repeatTime--; + } + + if (CurrentState == EnumHelper.DeviceState.DSExcept) + { + LogAsync(DateTime.Now, "鏉垮崱寮傚父鐘舵��", "杞�" + axisNum + "璇曞浘寮傚父鐘舵�佽繍鍔�"); + return; + } + + if (CurrentState != EnumHelper.DeviceState.DSOpen) + { + LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + axisNum + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�"); + throw new Exception("杞�" + axisNum + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null); + } + + int ret = 0; + repeatTime = 50; + do + { + LogAsync(DateTime.Now, "杞�" + axisNum + "鍚姩杩愬姩", "鐩爣鍧愭爣锛�" + nPosition); + ret = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)axisNum, nPosition * IConfig.AxisVelocityRatio); + + ret += GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1)); + if (ret != (Int32)APS_Define.ResultSuccess) + { + LogAsync(DateTime.Now, "杞�" + axisNum + "APS_absolute_move寮傚父", "杩斿洖鍊硷細" + ret + "锛涢噸璇曟鏁帮細" + repeatTime); + Thread.Sleep(50); + } + repeatTime--; + } while (ret != (Int32)APS_Define.ResultSuccess && repeatTime > 0); + + if (ret != (Int32)APS_Define.ResultSuccess) + { + LogAsync(DateTime.Now, "杞�" + axisNum + "鍚姩缁濆杩愬姩寮傚父", "閿欒鐮侊細" + ret); + throw new Exception("杞�" + axisNum + "鍚姩缁濆杩愬姩寮傚父锛岄敊璇爜锛�" + ret); + } + } + } + catch (Exception ex) + { + MoveStop(); + OnExceptionRaised?.Invoke(ex); + } + } + + Dictionary<int, AxisMovingStay> _axisStayDict = new Dictionary<int, AxisMovingStay>(); + + private async void MoveAbsStay(int axisNum) + { + await Task.Run(() => + { + while (CurrentState != EnumHelper.DeviceState.DSClose) + { + if (!_axisStayDict.ContainsKey(axisNum)) + { + _axisStayDict[axisNum] = new AxisMovingStay(); + } + + _axisStayDict[axisNum].MoveHandle.WaitOne(); + MoveAbsAsync(axisNum, _axisStayDict[axisNum].Position); + _axisStayDict[axisNum].MoveSendHandle.Set(); + } + }); + } + + /// <summary> + /// 鍔ㄤ綔缁撴潫 + /// </summary> + /// <param name="axisNum"></param> + /// <returns></returns> + public void RunFinish(int axisNum, bool isAbs = true) + { + MOTION_IO_STATUS MotionIoSts = new MOTION_IO_STATUS(); + MOTION_BOOL_STATUS MotionSts = new MOTION_BOOL_STATUS(); + var axisSetting = IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == axisNum); + int startTime = System.Environment.TickCount; + + //MDN淇″彿 + if (axisSetting.IsUseMDNStopSignal) + { + while (GetMotionIoStatus(axisNum, ref MotionIoSts) && GetMotionStatus(axisNum, ref MotionSts)) + { + if (MotionIoSts.EMG) + { + LogAsync(DateTime.Now, "杞�" + axisNum + "鎬ュ仠", ""); + throw new Exception("杞�" + axisNum + "鎬ュ仠"); + } + + if (MotionSts.MDN) + { + int stopCode = -1; + APS168.APS_get_stop_code(axisNum, ref stopCode); + + LogAsync(DateTime.Now, "杞�" + axisNum + "StopCode锛�", stopCode.ToString()); + + //0 姝e父鍋滄 4 姝f瀬闄� 5 璐熸瀬闄� + if (new List<int>() { 0, 4, 5 }.Contains(stopCode)) + { + if (new List<int>() { 4, 5 }.Contains(stopCode) && axisSetting.IsUseWarning) + { + MoveStop(true); + OnExceptionRaised?.Invoke(new Exception("杞�" + axisNum + "杩愬姩鑷虫瀬闄愪綅缃紝stopCode锛�" + stopCode.ToString(), null)); + return; + } + if (IConfig.ActionAfterDelay > 0) + { + Thread.Sleep(IConfig.ActionAfterDelay); + } + + int feedBack = 0; + GetPosition(axisNum, ref feedBack); + LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩缁撴潫", "褰撳墠浣嶇疆锛�" + feedBack); + break; + } + } + + } + } + else //INP淇″彿 + { + while (GetMotionIoStatus(axisNum, ref MotionIoSts) && GetMotionStatus(axisNum, ref MotionSts)) + { + if (MotionIoSts.EMG) + { + LogAsync(DateTime.Now, "杞�" + axisNum + "鎬ュ仠", ""); + throw new Exception("杞�" + axisNum + "鎬ュ仠"); + } + + + if (MotionSts.MDN && MotionIoSts.INP) + { + int stopCode = -1; + APS168.APS_get_stop_code(axisNum, ref stopCode); + + LogAsync(DateTime.Now, "杞�" + axisNum + "StopCode锛�", stopCode.ToString()); + + //0 姝e父鍋滄 4 姝f瀬闄� 5 璐熸瀬闄� + if (new List<int>() { 0, 4, 5 }.Contains(stopCode)) + { + if (new List<int>() { 4, 5 }.Contains(stopCode) && axisSetting.IsUseWarning) + { + MoveStop(true); + OnExceptionRaised?.Invoke(new AMPRunException("杞�" + axisNum + "杩愬姩鑷虫瀬闄愪綅缃紝stopCode锛�" + stopCode.ToString(), null)); + return; + } + + if (IConfig.ActionAfterDelay > 0) + { + Thread.Sleep(IConfig.ActionAfterDelay); + } + + int feedBack = 0; + GetPosition(axisNum, ref feedBack); + LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩缁撴潫", "褰撳墠浣嶇疆锛�" + feedBack); + break; + } + } + + } + } + } + + /// <summary> + /// Stop single axis move + /// </summary> + /// <param name="axisNum">axisNo</param> + /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param> + /// <returns></returns> + public void MoveStop(int axisNum, int option) + { + int ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option); + if (ret != (Int32)APS_Define.ResultSuccess) + { + LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄寮傚父", "閿欒鐮侊細" + ret); + throw new Exception("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret); + } + else + { + LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄", ""); + } + } + + static object motionIOLock = new object(); + /// <summary> + /// Get single Axis Motion_Io status and motion status + /// </summary> + /// <param name="nAxis"></param> + /// <param name="nMotionSts"></param> + /// <returns></returns> + public bool GetMotionStatus(int nAxis, ref MOTION_BOOL_STATUS strcMotionSts) + { + lock (motionIOLock) + { + int nMotionSts = 0; + nMotionSts = APS168.APS_motion_status(nAxis); + if (nMotionSts < 0) + { + return false; + } + strcMotionSts.ASTP = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.ASTP)); + strcMotionSts.HMV = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.HMV)); + strcMotionSts.MDN = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.MDN)); + strcMotionSts.DIR = Convert.ToBoolean(nMotionSts & (1 << (int)MOTION_STATUS.DIR)); + } + return true; + } + + /// <summary> + /// Get single Axis Motion_Io status and motion status + /// </summary> + /// <param name="nAxis"></param> + /// <param name="nMotionIoSts"></param> + /// <returns></returns> + public bool GetMotionIoStatus(int nAxis, ref MOTION_IO_STATUS strcMotionIoSts) + { + lock (motionIOLock) + { + //Thread.Sleep(15); + int nMotionIoSts = 0; + nMotionIoSts = APS168.APS_motion_io_status(nAxis); + if (nMotionIoSts < 0) + { + return false; + } + + bool isAlarm = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.ALM)); + if (strcMotionIoSts.ALM != isAlarm) + { + strcMotionIoSts.ALM = isAlarm; + OnMotionAlarm?.Invoke(nAxis, isAlarm); + } + + strcMotionIoSts.PEL = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.PEL)); + strcMotionIoSts.MEL = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.MEL)); + strcMotionIoSts.ORG = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.ORG)); + strcMotionIoSts.EMG = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.EMG)); + strcMotionIoSts.INP = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.INP)); + strcMotionIoSts.SVON = Convert.ToBoolean(nMotionIoSts & (1 << (int)MOTION_IOSTATUS.SVON)); + } + return true; + } + + public void MoveStop(bool emergencyStop = false) + { + int option = 0; + if (emergencyStop) + { + option = 1; + StateChange(EnumHelper.DeviceState.DSExcept); + } + + IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum => + { + MoveStop(axisNum.AxisIndex, option); + }); + } + + /// <summary> + /// 鍥炲師鐐� + /// </summary> + /// <param name="cardn">鍗″彿</param> + /// <param name="axisn">杞村彿</param> + /// <param name="homests">杞村洖鍘熺偣鐘舵��</param> + public bool GoHome(short cardn, short axisn, short home_mode, short home_dir, int homeoffset) + { + try + { + GTSCardAPI.GT_ZeroPos(cardn, axisn, 1); + GTSCardAPI.THomePrm thomeprm; + GTSCardAPI.THomeStatus homests; + short rtn = GTSCardAPI.GT_GetHomePrm(cardn, axisn, out thomeprm); + thomeprm.mode = home_mode;//鍥為浂鏂瑰紡 + thomeprm.moveDir = home_dir;//鍥為浂鏂瑰悜 + thomeprm.edge = 0; + thomeprm.velHigh = 50; + thomeprm.velLow = 50; + thomeprm.acc = 50; + thomeprm.dec = 50; + thomeprm.searchHomeDistance = 9999999;//鎼滄悳璺濈 + thomeprm.homeOffset = 0; //鍋忕Щ璺濈 + thomeprm.escapeStep = 1000; + rtn = GTSCardAPI.GT_GoHome(cardn, axisn, ref thomeprm); //鍚姩鍥為浂 + + while (true) + { + Thread.Sleep(5); + GTSCardAPI.GT_GetHomeStatus(cardn, axisn, out homests); + if (homests.run == 0) + { + if (homests.error == 0) + { + Thread.Sleep(200); + GTSCardAPI.GT_ZeroPos(cardn, axisn, 1); + } + return true; + } + } + } + catch (Exception ex) + { + MoveStop(); + OnExceptionRaised?.Invoke(ex); + return false; + } + } + + /// <summary> + /// 鍥炲師鐐� + /// </summary> + /// <param name="axisId"></param> + public void StartHoming(int axisId) + { + try + { + //servo on + APS168.APS_set_servo_on(axisId, 1); + Thread.Sleep(500); // Wait stable. + + // 2. Start home move + APS168.APS_home_move(axisId); + + WaitHomeFinish(axisId); + + axisDestination[axisId] = 0; + } + catch (Exception ex) + { + MoveStop(); + OnExceptionRaised?.Invoke(ex); + } + } + + /// <summary> + /// 鍥炲師鐐� + /// </summary> + /// <param name="axisId"></param> + /// <param name="homeMode"></param> + /// <param name="homeDir"></param> + /// <param name="praCurve"></param> + /// <param name="praAcc"></param> + /// <param name="praVm"></param> + public void StartHoming(int axisId, int homeMode, int homeDir, double praCurve, double praAcc, double praVm) + { + // 1. Select home mode and config home parameters + APS168.APS_set_axis_param(axisId, (Int32)APS_Define.PRA_HOME_MODE, homeMode); // Set home mode + APS168.APS_set_axis_param(axisId, (Int32)APS_Define.PRA_HOME_DIR, homeDir); // Set home direction + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_CURVE, praCurve); // Set acceleration paten (T-curve) + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_ACC, praAcc); // Set homing acceleration rate + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_VM, praVm); // Set homing maximum velocity. + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_VO, praVm / 5); // Set homing VO speed + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_EZA, 0); // Set EZ signal alignment (yes or no) + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_SHIFT, 0); // Set home position shfit distance. + APS168.APS_set_axis_param_f(axisId, (Int32)APS_Define.PRA_HOME_POS, 0); // Set final home position. + + StartHoming(axisId); + } + + /// <summary> + /// 鍥炲師鐐圭粨鏉� + /// </summary> + /// <param name="axisNum"></param> + /// <returns></returns> + public void WaitHomeFinish(int axisNum) + { + MOTION_IO_STATUS MotionIoSts = new MOTION_IO_STATUS(); + MOTION_BOOL_STATUS MotionSts = new MOTION_BOOL_STATUS(); + var axisSetting = IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == axisNum); + int startTime = System.Environment.TickCount; + while ((GetMotionIoStatus(axisNum, ref MotionIoSts)) && (GetMotionStatus(axisNum, ref MotionSts))) + { + if (MotionIoSts.EMG) + { + LogAsync(DateTime.Now, "杞村浣嶄腑" + axisNum + "鎬ュ仠", ""); + throw new Exception("杞村浣嶄腑" + axisNum + "鎬ュ仠"); + } + + if (axisSetting.HomeMode == 0) + { + if (!MotionSts.HMV && MotionIoSts.ORG) + break; + } + else + { + if (!MotionSts.HMV) + break; + } + + if (axisSetting.TimeOutHome < System.Environment.TickCount - startTime) + { + LogAsync(DateTime.Now, "杞村浣嶄腑" + axisNum + "鍥炲師鐐硅秴鏃�", ""); + MoveStop(axisNum); + throw new Exception("杞村浣嶄腑" + axisNum + "鍥炲師鐐硅秴鏃�"); + } + } + + //ClearPosition(axisNum); + } + + static object _ioLock = new object(); + /// <summary> + /// 璁剧疆IO鍗¤緭鍑� + /// </summary> + /// <param name="DINo">IO绔彛搴忓彿</param> + /// <param name="Value">璁剧疆鍊�(true:楂樼數骞筹紝 false:浣庣數骞�)</param> + /// <returns></returns> + public bool SetOutput(int DINo, bool Value) + { + if (OnCheckOutputAllowed?.Invoke(DINo, Value, new Dictionary<int, int>(axisDestination.ToDictionary(u => u.Key, u => u.Value))) ?? false) + { + OnExceptionRaised?.Invoke(new AMPRunException(DINo + "杈撳嚭" + Value.ToString() + "涓嶈鍏佽", null)); + return false; + } + + int ret = -1; + lock (_ioLock) + { + ret = APS168.APS_write_d_channel_output(0, 0, DINo, Value ? 1 : 0); + } + if (ret < 0) + { + return false; + } + return true; + } + + /// <summary> + /// 鑾峰彇杈撳叆淇″彿 + /// </summary> + /// <param name="stateType"></param> + /// <returns></returns> + public bool[] GetInputState() + { + int diVaule = 0; + + lock (_ioLock) + { + APS168.APS_read_d_input(0, 0, ref diVaule); + } + return GetBoolSig(diVaule); + //return new bool[16]; + } + + /// <summary> + /// 鑾峰彇杈撳嚭淇″彿 + /// </summary> + /// <param name="stateType"></param> + /// <returns></returns> + public bool[] GetOutputState() + { + int doVaule = 0; + + lock (_ioLock) + { + APS168.APS_read_d_output(0, 0, ref doVaule); + } + + return GetBoolSig(doVaule); + + } + + /// <summary> + /// 灏嗘棤绗﹀彿鏁村瀷杞崲涓築ool鍨嬫暟缁� + /// </summary> + /// <param name="sigStr"></param> + /// <returns></returns> + private bool[] GetBoolSig(int sigStr) + { + bool[] state = new bool[32]; + + for (int i = 0; i < 32; i++) + { + state[i] = (sigStr & (1 << i)) != 0; + } + return state; + } + + /// <summary> + /// 灏哹ool鏁扮粍杞崲鎴愭棤绗﹀彿鏁村瀷 + /// </summary> + /// <param name="sigArray"></param> + /// <returns></returns> + private int GetintSig(bool[] sigArray) + { + int state = -1; + + for (int i = 31; i > -1; i--) + { + state = (state << 1) + (sigArray[i] ? 1 : 0); + } + + return state; } /// <summary> @@ -99,36 +1004,45 @@ /// <summary> /// 杈撳嚭 /// </summary> - /// <param name="cardNumo">鍗″彿</param> + /// <param name="cardNum">鍗″彿</param> /// <param name="index">杈撳嚭鍙�,杩斿洖1-16</param> - /// <param name="value">0琛ㄧず杈撳嚭锛�1琛ㄧず鍏抽棴</param> - public void WriteOut(short cardNumo, short index, bool value) + /// <param name="value">false琛ㄧず杈撳嚭锛宼rue琛ㄧず鍏抽棴</param> + public void WriteOut(short cardNum, short index, bool value) { short outNum = (short)(index % 100 + 1); - switch (value) + if (value) { - case true: - { - GTSCardAPI.GT_SetDoBit(cardNumo, GTSCardAPI.MC_GPO, outNum, 0);//鎸変綅杈撳嚭锛�0琛ㄧず杈撳嚭锛�1琛ㄧず鍏抽棴 - } - break; - case false: - { - GTSCardAPI.GT_SetDoBit(cardNumo, GTSCardAPI.MC_GPO, outNum, 1);//鎸変綅杈撳嚭锛�0琛ㄧず杈撳嚭锛�1琛ㄧず鍏抽棴 - } - break; + GTSCardAPI.GT_SetDoBit(cardNum, GTSCardAPI.MC_GPO, outNum, 0); + } + else + { + GTSCardAPI.GT_SetDoBit(cardNum, GTSCardAPI.MC_GPO, outNum, 1); } } /// <summary> /// 鍋滄 鏌愪釜杞� /// </summary> - /// <param name="cardNum"></param> - /// <param name="axisNum"></param> + /// <param name="cardNum">鍗″彿</param> + /// <param name="axisNum">杞村彿</param> /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param> public void Stop(short cardNum, short axisNum, short option) { GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), option); + } + + /// <summary> + /// 鍋滄 鏌愪釜杞达紙寮傛锛� + /// </summary> + /// <param name="cardNum">鍗″彿</param> + /// <param name="axisNum">杞村彿</param> + /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param> + public async Task StopAsync(short cardNum, short axisNum, short option) + { + await Task.Run(() => + { + GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), option); + }); } /// <summary> @@ -137,21 +1051,15 @@ /// <param name="cardNum"></param> /// <param name="axisNum">杞村彿</param> /// <param name="value">鍋滄鏂瑰紡锛宖alse琛ㄧず骞虫粦鍋滄锛宼rue琛ㄧず绱ф�ュ仠姝�</param> - public void Stop(short cardNum, short axisNum, bool value) + public void Stop(short cardNum, short axisNum, bool emergencyStop) { - switch (value) + if (emergencyStop) { - case false: - { - GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 0); - } - break; - case true: - { - GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 1 << (axisNum - 1)); - - } - break; + GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 1 << (axisNum - 1)); + } + else + { + GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 0); } } @@ -190,21 +1098,21 @@ /// <summary> /// 璇诲彇IO杈撳嚭鐘舵�� /// </summary> - /// <param name="cardNumo"></param> + /// <param name="cardNum"></param> /// <param name="index"></param> /// <returns></returns> - public bool GetDoSts(short cardNumo, short index) + public bool GetDoSts(short cardNum, short index) { short outNum = 0; int outSts; outNum = (short)(index % 100); - GTSCardAPI.GT_GetDo(cardNumo, GTSCardAPI.MC_GPO, out outSts); + GTSCardAPI.GT_GetDo(cardNum, GTSCardAPI.MC_GPO, out outSts); if ((outSts & (1 << outNum)) == 0) return true; else return false; } - static object lockObj = new object(); - + + /// <summary> /// 璇诲彇褰撳墠鍊� @@ -218,7 +1126,7 @@ { double prfpos = 0; uint pclock = 0; GTSCardAPI.GT_GetPrfPos(cardNum, axisNum, out prfpos, 1, out pclock); - return prfpos / GTSCardParameter.Dangliang; + return prfpos / IConfig.AxisVelocityRatio; } } @@ -239,6 +1147,7 @@ else return false; //杩愯涓繑鍥瀎alse } } + #endregion public void Monitor() { diff --git a/src/Bro.Device.GTSCard/gts.dll b/src/Bro.Device.GTSCard/gts.dll new file mode 100644 index 0000000..bc0d7d1 --- /dev/null +++ b/src/Bro.Device.GTSCard/gts.dll Binary files differ diff --git a/src/Bro.Device.GTSCard/packages.config b/src/Bro.Device.GTSCard/packages.config new file mode 100644 index 0000000..07e3593 --- /dev/null +++ b/src/Bro.Device.GTSCard/packages.config @@ -0,0 +1,4 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Newtonsoft.Json" version="11.0.2" targetFramework="net452" /> +</packages> \ No newline at end of file -- Gitblit v1.8.0