Commit e8b2b136 LN

伺服调试优化

1 个父辈 0925a58d
......@@ -123,6 +123,12 @@
<Compile Include="ServoAxisInfo.Designer.cs">
<DependentUpon>ServoAxisInfo.cs</DependentUpon>
</Compile>
<Compile Include="useControl\AxisMoveControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="useControl\AxisMoveControl.Designer.cs">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="FrmAxisDebug.resx">
<DependentUpon>FrmAxisDebug.cs</DependentUpon>
</EmbeddedResource>
......@@ -157,6 +163,9 @@
<EmbeddedResource Include="ServoAxisInfo.resx">
<DependentUpon>ServoAxisInfo.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="useControl\AxisMoveControl.resx">
<DependentUpon>AxisMoveControl.cs</DependentUpon>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
......
......@@ -64,6 +64,8 @@ namespace OnlineStore.ACSquareStore
chbUseTrayCheck.Checked = StoreManager.UseShelfCheck;
// txtTempPort.Text = store.Config.Humiture_Port;
InitPosDebugBox();
axisMoveControl1.LoadData(StoreManager.Store.moveAxisList.ToArray());
tabControl1.TabPages.Remove(tabPage1);
LoadOk = true;
}
#region 库位调试
......@@ -1252,6 +1254,7 @@ namespace OnlineStore.ACSquareStore
//groupComAxis.Enabled = status;
groupInout.Enabled = status;
tabControl_Pos.Enabled = status;
axisMoveControl1.Enabled = status;
}
private void btnDebug_Click(object sender, EventArgs e)
......
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OnlineStore.DeviceLibrary;
using OnlineStore.Common;
using System.Threading;
using OnlineStore.LoadCSVLibrary;
namespace OnlineStore.AssemblyLine
{
public partial class AxisMoveControl : UserControl
{
private List<ConfigMoveAxis> axisList = new List<ConfigMoveAxis>();
private string PortName = "";
private int SlvAddr = 0;
public AxisMoveControl( )
{
InitializeComponent();
}
public void LoadData( params ConfigMoveAxis[] moveAxis)
{
axisList = new List<ConfigMoveAxis>(moveAxis);
if (axisList.Count > 0)
{
comboBox1.Items.Clear();
foreach (ConfigMoveAxis a in axisList)
{
comboBox1.Items.Add(a.Explain);
}
comboBox1.SelectedIndex = 0;
PortName = moveAxis[0].DeviceName;
SlvAddr = moveAxis[0].GetAxisValue();
txtAxisDeviceName.Text = PortName;
txtAxisValue.Text = SlvAddr.ToString();
}
}
private void btnOpenAxis_Click(object sender, EventArgs e)
{
LogUtil.info("点击【打开伺服】,【" + PortName + "_" + SlvAddr + "】 ");
ACServerManager.AlarmClear(PortName, SlvAddr);
System.Threading.Thread.Sleep(100);
ACServerManager.ServoOn(PortName, SlvAddr);
System.Threading.Thread.Sleep(100);
}
private void btnCloseAxis_Click(object sender, EventArgs e)
{
LogUtil.info("点击【关闭伺服】,【" + PortName + "_" + SlvAddr + "】 ");
// ACServerManager.ServoOff(PortName, SlvAddr);
ACServerManager.ServoOff(PortName, SlvAddr);
}
private void btnAxisAMove_Click(object sender, EventArgs e)
{
int position = FormUtil.GetIntValue(txtAPosition);
int speed = FormUtil.GetIntValue(txtASpeed);
LogUtil.info("点击【绝对运动】,【" + PortName + "_" + SlvAddr + "】位置【" + position + "】速度【" + speed + "】");
ACServerManager.AbsMove(PortName, SlvAddr, position, speed);
}
private void btnAxisRMove_Click(object sender, EventArgs e)
{
int position = FormUtil.GetIntValue(txtAPosition);
int speed = FormUtil.GetIntValue(txtASpeed);
LogUtil.info("点击【相对运动】,【" + PortName + "_" + SlvAddr + "】位置【" + position + "】速度【" + speed + "】");
ACServerManager.RelMove(PortName, SlvAddr, position, speed);
}
private void btnAxisVMove_Click(object sender, EventArgs e)
{
int speed = FormUtil.GetIntValue(txtASpeed);
LogUtil.info("点击【匀速运动】,【" + PortName + "_" + SlvAddr + "】 速度【" + speed + "】");
ACServerManager.SpeedMove(PortName, SlvAddr, speed);
}
private void btnAxisStop_Click(object sender, EventArgs e)
{
LogUtil.info("点击【停止运动】,【" + PortName + "_" + SlvAddr + "】 ");
ACServerManager.SuddenStop(PortName, SlvAddr);
if (btnAddMove.BackColor == Color.Green)
{
btnAddMove.BackColor = System.Drawing.SystemColors.Control;
}
if (btnDelMove.BackColor == Color.Green)
{
btnDelMove.BackColor = System.Drawing.SystemColors.Control;
}
btnReadPosition_Click(null, null);
}
private void btnComAlarmClear_Click(object sender, EventArgs e)
{
LogUtil.info("点击【清理报警】,【" + PortName + "_" + SlvAddr + "】 ");
ACServerManager.AlarmClear(PortName, SlvAddr);
Thread.Sleep(100);
ACServerManager.ServoOn(PortName, SlvAddr);
}
private void btnAxisReturnHome_Click(object sender, EventArgs e)
{
int speed = FormUtil.GetIntValue(txtASpeed);
LogUtil.info("点击【原点返回】,【" + PortName + "_" + SlvAddr + "】 速度【" + speed + "】");
ACServerManager.HomeMove(PortName, SlvAddr, speed);
}
private void btnGetAlarm_Click(object sender, EventArgs e)
{
txtServoStatue.Text = ACServerManager.SRV_ON(PortName, SlvAddr) ? "✔" : "✘";
this.txtAlarmStatus.Text = ACServerManager.GetAlarmStatus(PortName, SlvAddr).ToString();
this.txtBusyStatus.Text = ACServerManager.GetBusyStatus(PortName, SlvAddr).ToString();
this.txtHomeStatus.Text = ACServerManager.GetHomeEndStatus(PortName, SlvAddr).ToString();
this.txtHomeSingle.Text = ACServerManager.GetHomeSingle(PortName, SlvAddr).ToString();
this.txtLimit1.Text = ACServerManager.GetLimitPositiveSingle(PortName, SlvAddr).ToString();
this.txtLimit2.Text = ACServerManager.GetLimitNegativeSingle(PortName, SlvAddr).ToString();
txtServoStatue.Text = ACServerManager.ServerOnStatus(PortName, SlvAddr) ? "✔" : "✘";
}
private void btnReadPosition_Click(object sender, EventArgs e)
{
lblCountPulse.Text = ACServerManager.GetActualtPosition(PortName, SlvAddr).ToString();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex >= 0)
{
ConfigMoveAxis axis = axisList[comboBox1.SelectedIndex];
PortName = axis.DeviceName;
SlvAddr = axis.GetAxisValue();
txtAxisDeviceName.Text = PortName;
txtAxisValue.Text = SlvAddr.ToString();
Color color = Color.Black;
if (comboBox1.SelectedIndex.Equals(0))
{
btnAddMove.Text = "点动+(前进)";
btnDelMove.Text = "点动-(后退)";
color = Color.Blue;
}
else if (comboBox1.SelectedIndex.Equals(1))
{
btnAddMove.Text = "点动+(前进)";
btnDelMove.Text = "点动-(后退)";
color = Color.Green;
} else if (comboBox1.SelectedIndex.Equals(2))
{
btnAddMove.Text = "点动+(上升)";
btnDelMove.Text = "点动-(下降)";
color = Color.Red;
}
txtASpeed.Text = axis.TargetSpeed / 2 + "";
txtMiddleSpeed.Text = axis.TargetPosition / 2 + "";
btnOpenAxis.ForeColor = color;
btnCloseAxis.ForeColor = color;
btnAxisAMove.ForeColor = color;
btnAxisRMove.ForeColor = color;
btnAxisVMove.ForeColor = color;
btnAxisReturnHome.ForeColor = color;
btnAxisStop.ForeColor = color;
btnComAlarmClear.ForeColor = color;
btnReadPosition.ForeColor = color;
btnGetAlarm.ForeColor = color;
btnAddMove.ForeColor = color;
btnDelMove.ForeColor = color;
this.txtAlarmStatus.Text = "";
this.txtBusyStatus.Text = "";
this.txtHomeStatus.Text = "";
this.txtHomeSingle.Text = "";
this.txtLimit1.Text = "";
this.txtLimit2.Text = "";
txtServoStatue.Text = "";
}
}
private void AxisMove( int speed)
{
LogUtil.info("【" + PortName + "_" + SlvAddr + "】点动: 速度:" + speed);
ACServerManager.SpeedMove(PortName, SlvAddr, speed);
}
private void btnAddMove_MouseDown(object sender, MouseEventArgs e)
{
if (btnAddMove.BackColor.Equals(System.Drawing.SystemColors.Control))
{
int speed = FormUtil.GetIntValue(txtMiddleSpeed);
if (speed <= 0)
{
MessageBox.Show("提示", "请先输入正确的速度");
return;
}
btnAddMove.BackColor = Color.Green;
AxisMove( speed);
}
}
private void btnAddMove_MouseUp(object sender, MouseEventArgs e)
{
if (btnAddMove.BackColor == Color.Green )
{
btnAddMove.BackColor = System.Drawing.SystemColors.Control;
ACServerManager.SuddenStop(PortName, SlvAddr);
btnReadPosition_Click(null, null);
}
}
private void btnDelMove_MouseDown(object sender, MouseEventArgs e)
{
if (btnDelMove.BackColor.Equals(System.Drawing.SystemColors.Control))
{
int speed = FormUtil.GetIntValue(txtMiddleSpeed);
if (speed <= 0)
{
MessageBox.Show("提示", "请先输入正确的速度");
return;
}
btnDelMove.BackColor = Color.Green;
AxisMove(-speed);
}
}
private void btnDelMove_MouseUp(object sender, MouseEventArgs e)
{
if ( btnDelMove.BackColor == Color.Green)
{
btnDelMove.BackColor = System.Drawing.SystemColors.Control;
ACServerManager.SuddenStop(PortName, SlvAddr);
btnReadPosition_Click(null, null);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
......@@ -58,6 +58,7 @@
<Compile Include="acSquareStore\Square_BoxBean.cs" />
<Compile Include="acSquareStore\Square_BoxBean_Partial.cs" />
<Compile Include="acSquareStore\StoreManager.cs" />
<Compile Include="baan\AxisBean.cs" />
<Compile Include="IO\AIOBOX\AIOBOXManager.cs" />
<Compile Include="IO\IOManager.cs" />
<Compile Include="IO\KangNaiDe\KNDManager.cs" />
......
......@@ -8,11 +8,18 @@ namespace OnlineStore.DeviceLibrary
public class ACCMDManager
{
/// <summary>
/// 0020h 伺服 On 输入(SRV-ON) ReadOnly 0:输入 OFF、1:输入 ON
/// </summary>
public static string SRV_ON = "0020";
/// <summary>
/// 0130h 选通输入(STB) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary>
internal static string STB_State = "0130";
/// <summary>
/// 0132h 原点接近传感器输入 (HOME) 状态 ReadOnly 0: 输入 OFF 1: 输入 ON
/// </summary>
public static string Home_Single = "0132";
//
//
/// <summary>
/// 0022h 负方向驱动禁止输入(NOT) ReadOnly 0: 输入 OFF、 1: 输入 ON
/// </summary>
......
......@@ -28,6 +28,7 @@ namespace OnlineStore.DeviceLibrary
return null;
}
public static bool SendStrAndSleep(string portName, string str, int sleepS)
{
byte[] data = AcSerialBean.StringToByte(str);
......@@ -37,7 +38,7 @@ namespace OnlineStore.DeviceLibrary
bool result = SendData(portName, data);
System.Threading.Thread.Sleep(sleepS);
return result;
}
}
public static void SaveData(string portName, byte slvAddr, string regAddr, int value)
{
......@@ -91,12 +92,18 @@ namespace OnlineStore.DeviceLibrary
}
public static bool SendData(string portName, byte[] data)
{
if (data == null)
{
return false;
}
int timeOut = ReviceOutTimeMS;
//if (data[1].Equals((byte)10))
//{
// timeOut = 1000;
//}
bool result = false;
byte[] returnData = SendCommand(portName, data, ReviceOutTimeMS, 8, out result);
byte[] returnData = SendCommand(portName, data, timeOut, 8, out result);
if (returnData != null)
{
string strSend = "";
......@@ -152,9 +159,10 @@ namespace OnlineStore.DeviceLibrary
else
{
int ret= bean.SendCommand(data, ref returnData, outTime, reviceLength);
string rDataStr = AcSerialBean.ByteToString(returnData);
if (!ret.Equals(reviceLength))
{
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【"+reviceLength+"】实际返回【"+ret+"】");
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【"+reviceLength+"】实际返回【"+ret+"】【"+rDataStr+"】");
}
System.Threading.Thread.Sleep(2);
}
......@@ -172,7 +180,7 @@ namespace OnlineStore.DeviceLibrary
/// <param name="outTime">超时时间</param>
/// <param name="result">返回结果,是否发送成功</param>
/// <returns>返回值的长度</returns>
public static byte[] SendCommand(string portName, byte[] data, int outTime, int reviceLength,out bool result)
public static byte[] SendCommand(string portName, byte[] data, int outTime, int reviceLength, out bool result)
{
if (outTime < 100)
{
......@@ -207,12 +215,15 @@ namespace OnlineStore.DeviceLibrary
else
{
int ret = bean.SendCommand(data, ref returnData, outTime, reviceLength);
if (!ret.Equals(reviceLength))
{
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【" + reviceLength + "】实际返回【" + ret + "】");
}else
string datastr = AcSerialBean.ByteToString(returnData);
LogUtil.error("串口" + portName + " 写入数据:" + strSend + ",预计返回字节数【" + reviceLength + "】实际返回【" + ret + "】:"+ datastr);
}
else
{
result = true ;
result = true;
}
System.Threading.Thread.Sleep(2);
}
......@@ -270,15 +281,46 @@ namespace OnlineStore.DeviceLibrary
int length = 2;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
SendData(portName, dataArray);
System.Threading.Thread.Sleep(500);
data = "0000";
dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
SendData(portName, dataArray);
}
for (int i = 1; i <= 3; i++)
{
bool result = SendData(portName, dataArray);
if (result)
{
System.Threading.Thread.Sleep(500);
data = "0000";
dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_WriteCoil, addr, data, length);
result = SendData(portName, dataArray);
break;
}
else
{
LogUtil.error("【" + portName + "_" + slvAddr + "】 , 第" + i + "次,SuddenStop 发送数据失败");
Thread.Sleep(180);
}
}
}
public static void OpenAndCloseSTB(string portName, int slvAddr)
{
if (GetBusyStatus(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 busy=1,直接返回");
return;
}
System.Threading.Thread.Sleep(SleepMSendons);
if (GetSTBState(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 STB=ON,先关闭STB");
CloseSTB(portName, slvAddr);
System.Threading.Thread.Sleep(SleepMSendons);
if (GetSTBState(portName, slvAddr).Equals(1))
{
LogUtil.error("伺服【" + portName + "_" + slvAddr + "】OpenSTB时发现 STB=ON,先关闭STB 后发现STB仍为ON,直接返回");
return;
}
}
OnlyOpenSTB(portName, slvAddr);
System.Threading.Thread.Sleep(200);
CloseSTB(portName, slvAddr);
......@@ -382,7 +424,7 @@ namespace OnlineStore.DeviceLibrary
{
return GetActualtPosition(axis.DeviceName, axis.GetAxisValue());
}
public static int GetActualtPosition(string portName, int slvAddr)
public static int GetActualtPosition(string portName, int slvAddr,int rGetCount=3)
{
PreReadAddr = ACCMDManager.ActualPosition;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadRegisters, ACCMDManager.ActualPosition, "0000", 2);
......@@ -390,7 +432,7 @@ namespace OnlineStore.DeviceLibrary
byte[] reviceData = SendCommand(portName, dataArray, ReviceOutTimeMS, 9);
int result = -1;
for (int i = 1; i <= 3; i++)
for (int i = 1; i <= rGetCount; i++)
{
result = GetRegisterData(portName, reviceData, ACCMDManager.ActualPosition);
if (!result.Equals(-1))
......@@ -401,6 +443,7 @@ namespace OnlineStore.DeviceLibrary
{
LogUtil.error("第" + i + "次获取" + portName + "_" + slvAddr + "的实时位置" + result);
}
Thread.Sleep(180);
}
return result;
}
......@@ -469,6 +512,19 @@ namespace OnlineStore.DeviceLibrary
return GetCoilData(portName, reviceData, ACCMDManager.Home_Single);
}
/// <summary>
/// 获取STB信号值,1=On,0=OFF
/// </summary>
/// <param name="portName"></param>
/// <param name="slvAddr"></param>
/// <returns></returns>
public static int GetSTBState(string portName, int slvAddr)
{
PreReadCoilAddr = ACCMDManager.STB_State;
byte[] dataArray = ACCMDManager.GetWriteData(slvAddr, ACCMDManager.CMD_ReadCoil, ACCMDManager.STB_State, "0000", 1);
byte[] reviceData = SendCommand(portName, dataArray, ReviceOutTimeMS, 6);
return GetCoilData(portName, reviceData, ACCMDManager.STB_State);
}
/// <summary>
/// 负极限
/// </summary>
public static int GetLimitNegativeSingle(string portName, int slvAddr)
......
类型,说明,名称,属性值,设备名称,默认值,描述,电器定义,代码定义,SlaveID,
PRO,IO模块对应的DI数量,IO_DILength,192.168.200.11#16,,,,,,,,,,,,
PRO,模块对应的DO数量,IO_DOLength,192.168.200.11#16,,,,,,,,,,,,
PRO,是否有仓门,HasDoor,1,,,,,,,,,,,,
PRO,IO模块IP,PRO_AOI_IP_1,192.168.200.11,,,,,,,,,,,,
,,,,,,,,,,
DI,急停,SuddenStop_BTN,0,PRO_AOI_IP_1,0,急停,X1-01,A1,0,
DI,启动,Start_BTN,1,PRO_AOI_IP_1,0,启动,X1-02,A2,0,
DI,复位,Reset_BTN,2,PRO_AOI_IP_1,0,复位,X1-03,A3,0,
DI,前门门禁信号,DoorLimit_L,3,PRO_AOI_IP_1,0,前门门禁信号,X1-04,A4,0,
DI,后门门禁信号,DoorLimit_B,4,PRO_AOI_IP_1,0,后门门禁信号,X1-05,A5,0,
DI,左取料口门开关信号,LeftDoor_Close,5,PRO_AOI_IP_1,0,左取料口门开关信号,X1-06,A6,0,
DI,右取料口门开关信号,RightDoor_Close,6,PRO_AOI_IP_1,0,右取料口门开关信号,X1-07,A7,0,
DI,左侧出料下托架前进端,LeftShelf_Forward,7,PRO_AOI_IP_1,0,左侧出料下托架前进端,X1-08,A8,0,
DI,左侧出料下托架后退端,LeftShelf_Back,8,PRO_AOI_IP_1,0,左侧出料下托架后退端,X2-01,A10,0,
DI,右侧出料下托架前进端,RightShelf_Forward,9,PRO_AOI_IP_1,0,右侧出料下托架前进端,X2-02,A11,0,
DI,右侧出料下托架后退端,RightShelf_Back,10,PRO_AOI_IP_1,0,右侧出料下托架后退端,X2-03,A12,0,
DI,货叉物料检测开关,TrayCheck_Fixture,11,PRO_AOI_IP_1,0,货叉物料检测开关,X2-04,A13,0,
DI,空气压力检测信号,Airpressure_Check,12,PRO_AOI_IP_1,0,空气压力检测信号,X2-05,A14,0,
DI,托架物料检测(左),LeftShelf_Check,13,PRO_AOI_IP_1,0,托架物料检测(左),X2-06,A15,0,
DI,托架物料检测(右),RightShelf_Check,14,PRO_AOI_IP_1,0,托架物料检测(右),X2-07,A16,0,
,,,15,PRO_AOI_IP_1,0,,X2-08,A17,0,
DO,运行指示灯,AutoRun_HddLed,0,PRO_AOI_IP_1,0,运行指示灯,Y1-01,B1,,
DO,故障指示灯,Alarm_HddLed,1,PRO_AOI_IP_1,0,故障指示灯,Y1-02,B2,,
DO,待机指示灯,RunSign_HddLed,2,PRO_AOI_IP_1,0,待机指示灯,Y1-03,B3,,
DO,蜂鸣器,Alarm_Buzzer,3,PRO_AOI_IP_1,0,蜂鸣器,Y1-04,B4,,
DO,左侧出料下托架电机前进,LeftShelf_Forward,4,PRO_AOI_IP_1,0,左侧出料下托架电机前进,Y1-05,B5,,
DO,左侧出料下托架电机后退,LeftShelf_Back,5,PRO_AOI_IP_1,0,左侧出料下托架电机后退,Y1-06,B6,,
DO,右侧出料下托架电机前进,RightShelf_Forward,6,PRO_AOI_IP_1,0,右侧出料下托架电机前进,Y1-07,B7,,
DO,右侧出料下托架电机后退,RightShelf_Back,7,PRO_AOI_IP_1,0,右侧出料下托架电机后退,Y1-08,B8,,
DO,左侧门锁气缸,LeftDoor_Close,8,PRO_AOI_IP_1,0,左侧门锁气缸,Y2-01,B10,,
DO,右侧门锁气缸,RightDoor_Close,9,PRO_AOI_IP_1,0,右侧门锁气缸,Y2-02,B11,,
DO,伺服运转ON,Run_Signal,10,PRO_AOI_IP_1,0,伺服运转ON,Y2-03,B12,,
DO,Z轴伺服刹车ON,Axis_Brake,11,PRO_AOI_IP_1,0,Z轴伺服刹车ON,Y2-04,B13,,
DO,温湿度喷气电磁阀,StartOrStopBlow,12,PRO_AOI_IP_1,0,温湿度喷气电磁阀,Y2-05,B14,,
,,,13,PRO_AOI_IP_1,0,,Y2-06,B15,,
,,,14,PRO_AOI_IP_1,0,,Y2-07,B16,,
,,,15,PRO_AOI_IP_1,0,,Y2-08,B17,,
AXIS,(X轴-前后轴) ,Middle_Axis,1,COM2,0,,,,,
AXIS,(Y轴-进出轴),InOut_Axis,3,COM2,0,,,,,
AXIS,(Z轴-升降轴),UpDown_Axis,2,COM2,0,,,,,
,,,,,,,,,,
PRO,升降轴 进料口取料点 P1,UpDownAxis_DoorO_P1,61268,,,,,,,,,,,,
PRO,升降轴 进料口出料前点 P2,UpDownAxis_DoorI_P2,91242,,,,,,,,,,,,
PRO,升降轴 进料口取料缓冲点 P7,UpDownAxis_DoorOB_P7,91242,,,,,,,,,,,,
PRO,升降轴 进料口出料缓冲点 P8,UpDownAxis_DoorIB_P8,61268,,,,,,,,,,,,
PRO,(X轴-前后轴)P1 待机原位点,MiddleAxis_P1_Position,25250,,,,,,,,,,,,
PRO,( Y轴-进出轴)P1待机原位点,InOutAxis_P1_Position,0,,,,,,,,,,,,
PRO,( Y轴-进出轴)P1左侧托架取料点P2,InOutAxis_P2_Position,167268,,,,,,,,,,,,
PRO,( Y轴-进出轴)P1右侧托架取料点P3,InOutAxis_P3_Position,-168641,,,,,,, ,,,,,
PRO,是否有左右侧门,IsHasDoorLimit,1,,,,,,, ,,,,,
PRO,气压检测IO关闭需要持续的时间,AirCheckSeconds,3,,,,,,, ,,,,,
,,,,,,,,,,
PRO,预警温度,WarnTemperate,80,,,,,,,,,,,,
PRO,预警湿度,WarnHumidity,80,,,,,,,,,,,,
PRO,(X轴-前后轴) 目标速度,MiddleAxis_TargetSpeed,500,,,,,,,,,,,,
PRO,(X轴-前后轴) 加速度,MiddleAxis_AddSpeed,5000,,,,,,,,,,,,
PRO,(X轴-前后轴) 减速度,MiddleAxis_DelSpeed,5000,,,,,,,,,,,,
PRO,(X轴-前后轴) 原点低速度,MiddleAxis_HomeLowSpeed,80,,,,,,,,,,,,
PRO,(X轴-前后轴) 原点高速,MiddleAxis_HomeHighSpeed,60,,,,,,,,,,,,
PRO,(X轴-前后轴) 原点加速度,MiddleAxis_HomeAddSpeed,50,,,,,,,,,,,,
PRO,(Z轴-升降轴)目标速度,UpdownAxis_TargetSpeed,500,,,,,,,,,,,,
PRO,(Z轴-升降轴)加速度,UpdownAxis_AddSpeed,4000,,,,,,,,,,,,
PRO,(Z轴-升降轴)减速度,UpdownAxis_DelSpeed,4000,,,,,,,,,,,,
PRO,(Z轴-升降轴)原点低速度,UpdownAxis_HomeLowSpeed,100,,,,,,,,,,,,
PRO,(Z轴-升降轴)原点高速,UpdownAxis_HomeHighSpeed,200,,,,,,,,,,,,
PRO,(Z轴-升降轴)原点加速度,UpdownAxis_HomeAddSpeed,200,,,,,,,,,,,,
PRO,( Y轴-进出轴)目标速度,InoutAxis_TargetSpeed,200,,,,,,,,,,,,
PRO,( Y轴-进出轴)加速度,InoutAxis_AddSpeed,5000,,,,,,,,,,,,
PRO,( Y轴-进出轴)减速度,InoutAxis_DelSpeed,5000,,,,,,,,,,,,
PRO,( Y轴-进出轴)原点低速,InoutAxis_HomeLowSpeed,20,,,,,,,,,,,,
PRO,( Y轴-进出轴)原点高速,InoutAxis_HomeHighSpeed,60,,,,,,,,,,,,
PRO,( Y轴-进出轴)原点加速度,InoutAxis_HomeAddSpeed,200,,,,,,, ,,,,,
,,,,,,,,,,
PRO,(Z轴-升降轴)P1速度,UpDownAxis_P1_Speed,1800,,,,,,,,,,,,
PRO,(Z轴-升降轴)P2速度,UpDownAxis_P2_Speed,1800,,,,,,,,,,,,
PRO,(Z轴-升降轴)P3速度,UpDownAxis_P3_Speed,1800,,,,,,,,,,,,
PRO,(Z轴-升降轴)P4速度,UpDownAxis_P4_Speed,500,,,,,,,,,,,,
PRO,(Z轴-升降轴)P5速度,UpDownAxis_P5_Speed,1800,,,,,,,,,,,,
PRO,(Z轴-升降轴)P6速度,UpDownAxis_P6_Speed,500,,,,,,,,,,,,
PRO,(Z轴-升降轴)P7速度,UpDownAxis_P7_Speed,500,,,,,, ,,,,,,
PRO,(Z轴-升降轴)P8速度,UpDownAxis_P8_Speed,500,,,,,,,,,,,,
PRO,(X轴-前后轴)P1速度,MiddleAxis_P1_Speed,2000,,,,,,,,,,,,
PRO,(X轴-前后轴)P2速度,MiddleAxis_P2_Speed,2000,,,,,,,,,,,,
PRO,(Y轴-进出轴)P1速度,InOutAxis_P1_Speed,500,,,,,,,,,,,,
PRO,(Y轴-进出轴)P2速度,InOutAxis_P2_Speed,500,,,,,,,,,,,,
PRO,(Y轴-进出轴)P3速度,InOutAxis_P3_Speed,500,,,,,,, ,,,,,
PRO,(Y轴-进出轴)P4速度,InOutAxis_P4_Speed,500,,,,,,, ,,,,,
PRO,(X轴-前后轴) 停止时可误差的脉冲数的最小值,MiddleAxis_ErrorCountMin,10,,,,,,,,,,,,
PRO,(Z轴-升降轴)停止时可误差的脉冲数的最小值,UpdownAxis_ErrorCountMin,10,,,,,, ,,,,,,
PRO,(Y轴-进出轴)停止时可误差的脉冲数的最小值,InoutAxis_ErrorCountMin,10,,,,,,,,,,,,
PRO,(X轴-前后轴) 停止时可误差的脉冲数的最大值,MiddleAxis_ErrorCountMax,1000,,,,,,,,,,,,
PRO,(Z轴-升降轴)停止时可误差的脉冲数的最大值,UpdownAxis_ErrorCountMax,1000,,,,,,,,,,,,
PRO,(Y轴-进出轴)停止时可误差的脉冲数的最大值,InoutAxis_ErrorCountMax,1000,,,,,,,,,,,,
PRO,出入库多少次,会自动重置前后轴,Box_ResetMCount,1000,,,,,,,,,,,,
PRO,出入库多少次,会自动重置所有轴操作,Box_ResetACount,100,,,,,,,,,,,,
PRO,IO信号超时时间(毫秒),IOSingle_TimerOut,10000,,,,,,,,,,,,
PRO,是否使用料盘检测信号,IsUse_Tray_Check,0,,,,,, ,,,,,,
PRO,(X轴-前后轴) 最小限位,MiddleAxis_PositionMin,0,,,,,,,,,,,,
PRO,(Z轴-升降轴)最小限位,UpdownAxis_PositionMin,0,,,,,,,,,,,,
PRO,(Y轴-进出轴)最小限位,InoutAxis_PositionMin,0,,,,,,,,,,,,
PRO,(X轴-前后轴) 最大限位,MiddleAxis_PositionMax,0,,,,,,,,,,,,
PRO,(Z轴-升降轴)最大限位,UpdownAxis_PositionMax,0,,,,,,,,,,,,
PRO,(Y轴-进出轴)最大限位,InoutAxis_PositionMax,0,,,,,,,,,,,,
PRO,需要吹气的温度(温度标准),Max_Temperature,0,,,,,,,,,,,,
PRO,需要吹气的湿度(湿度标准),Max_Humidity,10,,,,,,,,,,,,
PRO,每次吹气的时间(分钟),BlowAir_Time,10,,,,,,,,,,,,
PRO,两次吹气间隔(分钟),BlowAir_Interval,0,,,,,,, ,,,,,
PRO,温湿度端口号(分号分隔),Humiture_Port,COM3;COM4;COM5,,,,,,,,,,,,
,,,,,,,,, ,
,,,,,,,,, ,
位置,优先级,高度,宽度,料仓ID,前后轴位置P2,升降轴库位出料前点P5,升降轴库位出料缓冲点P6,升降轴库位入料前点P3,升降轴库位入料缓冲点P4,进出轴库位取料点P4
AC1#L1_1_1,132,34,38,1,398000,55000,110000,110000,55000,170000
AC1#L1_1_2,131,30,38,1,398800,361000,410000,410000,361000,170000
AC1#L1_1_3,130,30,38,1,398800,661000,710000,710000,661000,170000
AC1#L1_1_4,129,20,38,1,398800,961000,1010000,1010000,961000,170000
AC1#L1_1_5,128,20,38,1,398800,1261000,1310000,1310000,1261000,170000
AC1#L1_1_6,127,20,38,1,398800,1561000,1610000,1610000,1561000,170000
AC1#L2_1_1,126,34,38,1,679000,55000,110000,110000,55000,170000
AC1#L2_1_2,125,30,38,1,679000,361000,410000,410000,361000,170000
AC1#L2_1_3,124,30,38,1,679000,661000,710000,710000,661000,170000
AC1#L2_1_4,123,20,38,1,679000,961000,1010000,1010000,961000,170000
AC1#L2_1_5,122,20,38,1,679000,1261000,1310000,1310000,1261000,170000
AC1#L2_1_6,121,20,38,1,679500,1561000,1610000,1610000,1561000,170000
AC1#L3_1_1,120,34,38,1,960818,55000,110000,110000,55000,170000
AC1#L3_1_2,119,30,38,1,960818,361000,410000,410000,361000,170000
AC1#L3_1_3,118,30,38,1,960818,661000,710000,710000,661000,170000
AC1#L3_1_4,117,20,38,1,960818,961000,1010000,1010000,961000,170000
AC1#L3_1_5,116,20,38,1,960818,1261000,1310000,1310000,1261000,170000
AC1#L3_1_6,115,20,38,1,961818,1561000,1610000,1610000,1561000,170000
AC1#L4_1_1,114,34,38,1,1243818,55000,110000,110000,55000,170000
AC1#L4_1_2,113,30,38,1,1243818,361000,410000,410000,361000,170000
AC1#L4_1_3,112,30,38,1,1243818,661000,710000,710000,661000,170000
AC1#L4_1_4,111,20,38,1,1243818,961000,1010000,1010000,961000,170000
AC1#L4_1_5,110,20,38,1,1245818,1261000,1310000,1310000,1261000,170000
AC1#L4_1_6,109,20,38,1,1245818,1561000,1610000,1610000,1561000,170000
AC1#L5_1_1,108,34,38,1,1524418,55000,110000,110000,55000,170000
AC1#L5_1_2,107,30,38,1,1524418,361000,410000,410000,361000,170000
AC1#L5_1_3,106,30,38,1,1524418,661000,710000,710000,661000,170000
AC1#L5_1_4,105,20,38,1,1525019,961000,1010000,1010000,961000,170000
AC1#L5_1_5,104,20,38,1,1525019,1261000,1310000,1310000,1261000,170000
AC1#L5_1_6,103,20,38,1,1525019,1561000,1610000,1610000,1561000,170000
AC1#L6_1_1,102,34,38,1,1804118,55000,110000,110000,55000,170000
AC1#L6_1_2,101,30,38,1,1804118,361000,410000,410000,361000,170000
AC1#L6_1_3,100,30,38,1,1805118,661000,710000,710000,661000,170000
AC1#L6_1_4,99,20,38,1,1805118,961000,1010000,1010000,961000,170000
AC1#L6_1_5,98,20,38,1,1805118,1261000,1310000,1310000,1261000,170000
AC1#L6_1_6,97,20,38,1,1805118,1561000,1610000,1610000,1561000,170000
AC1#L7_1_1,96,34,38,1,2084918,55000,110000,110000,55000,170000
AC1#L7_1_2,95,30,38,1,2085718,361000,410000,410000,361000,170000
AC1#L7_1_3,94,30,38,1,2086518,661000,710000,710000,661000,170000
AC1#L7_1_4,93,20,38,1,2087318,961000,1010000,1010000,961000,170000
AC1#L7_1_5,92,20,38,1,2088118,1261000,1310000,1310000,1261000,170000
AC1#L7_1_6,91,20,38,1,2088918,1561000,1610000,1610000,1561000,170000
AC1#L8_1_1,90,34,38,1,2366918,55000,110000,110000,55000,170000
AC1#L8_1_2,89,30,38,1,2367718,361000,410000,410000,361000,170000
AC1#L8_1_3,88,30,38,1,2368518,661000,710000,710000,661000,170000
AC1#L8_1_4,87,20,38,1,2369318,961000,1010000,1010000,961000,170000
AC1#L8_1_5,86,20,38,1,2370118,1261000,1310000,1310000,1261000,170000
AC1#L8_1_6,85,20,38,1,2370918,1561000,1610000,1610000,1561000,170000
AC1#L9_1_1,84,34,38,1,2647418,55000,110000,110000,55000,170000
AC1#L9_1_2,83,30,38,1,2647418,361000,410000,410000,361000,170000
AC1#L9_1_3,82,30,38,1,2647418,661000,710000,710000,661000,170000
AC1#L9_1_4,81,20,38,1,2647418,961000,1010000,1010000,961000,170000
AC1#L9_1_5,80,20,38,1,2650618,1261000,1310000,1310000,1261000,170000
AC1#L9_1_6,79,20,38,1,2650618,1561000,1610000,1610000,1561000,170000
AC1#L10_1_1,78,34,38,1,2929618,55000,110000,110000,55000,170000
AC1#L10_1_2,77,30,38,1,2929618,361000,410000,410000,361000,170000
AC1#L10_1_3,76,30,38,1,2929618,661000,710000,710000,661000,170000
AC1#L10_1_4,75,20,38,1,2929618,961000,1010000,1010000,961000,170000
AC1#L10_1_5,74,20,38,1,2932818,1261000,1310000,1310000,1261000,170000
AC1#L10_1_6,73,20,38,1,2932818,1561000,1610000,1610000,1561000,170000
AC1#L11_1_1,72,34,38,1,3210018,55000,110000,110000,55000,170000
AC1#L11_1_2,71,30,38,1,3211018,361000,410000,410000,361000,170000
AC1#L11_1_3,70,30,38,1,3212018,661000,710000,710000,661000,170000
AC1#L11_1_4,69,20,38,1,3213018,961000,1010000,1010000,961000,170000
AC1#L11_1_5,68,20,38,1,3216402,1261000,1310000,1310000,1261000,170000
AC1#L11_1_6,67,20,38,1,3216402,1561000,1610000,1610000,1561000,170000
AC1#R1_1_1,66,34,38,1,398000,55000,110000,110000,55000,-170000
AC1#R1_1_2,65,30,38,1,398800,361000,410000,410000,361000,-170000
AC1#R1_1_3,64,30,38,1,398800,661000,710000,710000,661000,-170000
AC1#R1_1_4,63,20,38,1,398800,961000,1010000,1010000,961000,-170000
AC1#R1_1_5,62,20,38,1,398800,1261000,1310000,1310000,1261000,-170000
AC1#R1_1_6,61,20,38,1,398800,1561000,1610000,1610000,1561000,-170000
AC1#R2_1_1,60,34,38,1,679000,55000,110000,110000,55000,-170000
AC1#R2_1_2,59,30,38,1,679000,361000,410000,410000,361000,-170000
AC1#R2_1_3,58,30,38,1,679000,661000,710000,710000,661000,-170000
AC1#R2_1_4,57,20,38,1,679000,961000,1010000,1010000,961000,-170000
AC1#R2_1_5,56,20,38,1,679000,1261000,1310000,1310000,1261000,-170000
AC1#R2_1_6,55,20,38,1,679500,1561000,1610000,1610000,1561000,-170000
AC1#R3_1_1,54,34,38,1,960818,55000,110000,110000,55000,-170000
AC1#R3_1_2,53,30,38,1,960818,361000,410000,410000,361000,-170000
AC1#R3_1_3,52,30,38,1,960818,661000,710000,710000,661000,-170000
AC1#R3_1_4,51,20,38,1,960818,961000,1010000,1010000,961000,-170000
AC1#R3_1_5,50,20,38,1,960818,1261000,1310000,1310000,1261000,-170000
AC1#R3_1_6,49,20,38,1,961818,1561000,1610000,1610000,1561000,-170000
AC1#R4_1_1,48,34,38,1,1243818,55000,110000,110000,55000,-170000
AC1#R4_1_2,47,30,38,1,1243818,361000,410000,410000,361000,-170000
AC1#R4_1_3,46,30,38,1,1243818,661000,710000,710000,661000,-170000
AC1#R4_1_4,45,20,38,1,1243818,961000,1010000,1010000,961000,-170000
AC1#R4_1_5,44,20,38,1,1245818,1261000,1310000,1310000,1261000,-170000
AC1#R4_1_6,43,20,38,1,1245818,1561000,1610000,1610000,1561000,-170000
AC1#R5_1_1,42,34,38,1,1524418,55000,110000,110000,55000,-170000
AC1#R5_1_2,41,30,38,1,1524418,361000,410000,410000,361000,-170000
AC1#R5_1_3,40,30,38,1,1524418,661000,710000,710000,661000,-170000
AC1#R5_1_4,39,20,38,1,1525019,961000,1010000,1010000,961000,-170000
AC1#R5_1_5,38,20,38,1,1525019,1261000,1310000,1310000,1261000,-170000
AC1#R5_1_6,37,20,38,1,1525019,1561000,1610000,1610000,1561000,-170000
AC1#R6_1_1,36,34,38,1,1804118,55000,110000,110000,55000,-170000
AC1#R6_1_2,35,30,38,1,1804118,361000,410000,410000,361000,-170000
AC1#R6_1_3,34,30,38,1,1805118,661000,710000,710000,661000,-170000
AC1#R6_1_4,33,20,38,1,1805118,961000,1010000,1010000,961000,-170000
AC1#R6_1_5,32,20,38,1,1805118,1261000,1310000,1310000,1261000,-170000
AC1#R6_1_6,31,20,38,1,1805118,1561000,1610000,1610000,1561000,-170000
AC1#R7_1_1,30,34,38,1,2084918,55000,110000,110000,55000,-170000
AC1#R7_1_2,29,30,38,1,2085718,361000,410000,410000,361000,-170000
AC1#R7_1_3,28,30,38,1,2086518,661000,710000,710000,661000,-170000
AC1#R7_1_4,27,20,38,1,2087318,961000,1010000,1010000,961000,-170000
AC1#R7_1_5,26,20,38,1,2088118,1261000,1310000,1310000,1261000,-170000
AC1#R7_1_6,25,20,38,1,2088918,1561000,1610000,1610000,1561000,-170000
AC1#R8_1_1,24,34,38,1,2366918,55000,110000,110000,55000,-170000
AC1#R8_1_2,23,30,38,1,2367718,361000,410000,410000,361000,-170000
AC1#R8_1_3,22,30,38,1,2368518,661000,710000,710000,661000,-170000
AC1#R8_1_4,21,20,38,1,2369318,961000,1010000,1010000,961000,-170000
AC1#R8_1_5,20,20,38,1,2370118,1261000,1310000,1310000,1261000,-170000
AC1#R8_1_6,19,20,38,1,2370918,1561000,1610000,1610000,1561000,-170000
AC1#R9_1_1,18,34,38,1,2647418,55000,110000,110000,55000,-170000
AC1#R9_1_2,17,30,38,1,2647418,361000,410000,410000,361000,-170000
AC1#R9_1_3,16,30,38,1,2647418,661000,710000,710000,661000,-170000
AC1#R9_1_4,15,20,38,1,2647418,961000,1010000,1010000,961000,-170000
AC1#R9_1_5,14,20,38,1,2650618,1261000,1310000,1310000,1261000,-170000
AC1#R9_1_6,13,20,38,1,2650618,1561000,1610000,1610000,1561000,-170000
AC1#R10_1_1,12,34,38,1,2929618,55000,110000,110000,55000,-170000
AC1#R10_1_2,11,30,38,1,2929618,361000,410000,410000,361000,-170000
AC1#R10_1_3,10,30,38,1,2929618,661000,710000,710000,661000,-170000
AC1#R10_1_4,9,20,38,1,2929618,961000,1010000,1010000,961000,-170000
AC1#R10_1_5,8,20,38,1,2932818,1261000,1310000,1310000,1261000,-170000
AC1#R10_1_6,7,20,38,1,2932818,1561000,1610000,1610000,1561000,-170000
AC1#R11_1_1,6,34,38,1,3210018,55000,110000,110000,55000,-170000
AC1#R11_1_2,5,30,38,1,3211018,361000,410000,410000,361000,-170000
AC1#R11_1_3,4,30,38,1,3212018,661000,710000,710000,661000,-170000
AC1#R11_1_4,3,20,38,1,3213018,961000,1010000,1010000,961000,-170000
AC1#R11_1_5,2,20,38,1,3216402,1261000,1310000,1310000,1261000,-170000
AC1#R11_1_6,1,20,38,1,3216402,1561000,1610000,1610000,1561000,-170000
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace OnlineStore.DeviceLibrary
{
public class WaitUtil
{
public delegate bool IsOk();
/// <summary>
/// 使用异步委托检测超时,防止isOk方法不返回结果导致卡死的问题
/// </summary>
/// <param name="waitName"></param>
/// <param name="timeout"></param>
/// <param name="isOk"></param>
public static bool Wait(int timeout, IsOk isOk, string waitName = "")
{
DateTime startTime = System.DateTime.Now;
TimeSpan timoutSpan = TimeSpan.FromMilliseconds(timeout);
TimeSpan waitSpan = TimeSpan.FromMilliseconds(0);
int sleepTime = 10;
while (true)
{
TimeSpan remainTimes = timoutSpan.Subtract(waitSpan);
if (remainTimes.TotalMilliseconds < 0)
{
//已经超时
throw new TimeoutException(waitName + "超时");
}
try
{
IAsyncResult re = isOk.BeginInvoke(null, null);
var waitResult = re.AsyncWaitHandle.WaitOne(remainTimes);
if (waitResult)
{
bool okResult = isOk.EndInvoke(re);
if (okResult)
{
return true ;
}
}
}
catch (Exception ex)
{
LogUtil.error("同步等待出现异常:" ,ex);
}
Thread.Sleep(sleepTime);
waitSpan = System.DateTime.Now.Subtract(startTime);
}
}
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!