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