Commit 2929183d LN

压紧轴改为伺服,io改为零点。使用新的IO配置

1 个父辈 a353a455
正在显示 49 个修改的文件 包含 2282 行增加5329 行删除
此文件类型无法预览
此文件类型无法预览
<?xml version="1.0"?>
<doc>
<assembly>
<name>mdbsmnglib</name>
<name>Asa.IOModule.AIOBOX</name>
</assembly>
<members>
<member name="T:OMLib.Communication.ModbusInfo.ExceptionCode">
<member name="T:Asa.IOModule.AIOBOX">
<summary>
Exception code(Exception response from the driver)
AIOBOX操作类
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ExceptionCode.NOERROR">
<member name="F:Asa.IOModule.AIOBOX.suspend">
<summary>
No error
暂停次数
WriteDO 命令非常多时,暂停一次发送 ReadDI 或 ReadDO
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ExceptionCode.INVALID_FUNCTION">
<member name="F:Asa.IOModule.AIOBOX.SEND_SLEEP">
<summary>
The process could not be executed because the function code was invalid.
<list type="bullet">
<item><description>The function code is not supported.</description></item>
<item><description>The sub-function code for diagnosis (08h) is other than 00h.</description></item>
</list>
每条命令发送的间隔
不能小于15,会出现IO接收不到的情况
小于30时,会出现接收数据连包的情况
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ExceptionCode.INVALID_DATAADDRESS">
<member name="F:Asa.IOModule.AIOBOX.NET_SLEEP">
<summary>
The process could not be executed because the data address was invalid.
<list type="bullet">
<item><description>The address is not supported (other than 0000h to 1FFFh).</description></item>
<item><description>Register address and number of registers are 2000h or more in total.</description></item>
</list>
监听网络接收数据的间隔
必须小于SEND_SLEEP
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ExceptionCode.INVALID_DATA">
<member name="F:Asa.IOModule.AIOBOX.TRIG_SLEEP">
<summary>
The process could not be executed because the data was invalid.
<list type="bullet">
<item><description>The number of registers is 0 or more than 17.</description></item>
<item><description>The number of bytes is other than twice the number of registers.</description></item>
<item><description>The data length is outside the specified range.</description></item>
</list>
触发DIO状态事件的间隔
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ExceptionCode.SLAVE_ERROR">
<member name="T:Asa.IOModule.AIOBOX.DI_Changed">
<summary>
The process could not be executed because an error occurred at the slave.
<list type="bullet">
<item><description>Downloading, initializing or teaching function is in progress using the OPX-2A</description></item>
<item><description>Downloading or initialization is in progress using the MEXE02</description></item>
<item><description>Internal processing was in progress. (S-BSY is ON.)</description></item>
<item><description>An EEPROM error alarm was present.</description></item>
<item><description>Outside the parameter setting range</description></item>
<item><description>Command execute disable</description></item>
</list>
自动读取DI委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DI状态</param>
</member>
<member name="T:OMLib.Communication.ModbusInfo.FrameInfo">
<member name="E:Asa.IOModule.AIOBOX.DI_Changed_Event">
<summary>
Information of the frame
自动读取DI事件触发
</summary>
</member>
<member name="M:OMLib.Communication.ModbusInfo.FrameInfo.Frame">
<member name="T:Asa.IOModule.AIOBOX.DO_Changed">
<summary>
Get the frame.
自动读取DO委托
</summary>
<returns>Frame</returns>
<param name="box">AIOBOX</param>
<param name="sta">所有DO状态</param>
</member>
<member name="P:OMLib.Communication.ModbusInfo.FrameInfo.SlaveAddress">
<member name="E:Asa.IOModule.AIOBOX.DO_Changed_Event">
<summary>
Slave Address
自动读取DO事件触发
</summary>
</member>
<member name="P:OMLib.Communication.ModbusInfo.FrameInfo.FunctionCode">
<member name="T:Asa.IOModule.AIOBOX.AI_Changed">
<summary>
Function Code
自动读取AI委托
</summary>
<param name="box">AIOBOX</param>
<param name="val">所有AI的值</param>
</member>
<member name="T:OMLib.Communication.ModbusInfo.SendReceiveData">
<member name="E:Asa.IOModule.AIOBOX.AI_Changed_Event">
<summary>
Data transmission and reception
自动读取AI事件触发
</summary>
</member>
<member name="M:OMLib.Communication.ModbusInfo.SendReceiveData.GetError">
<member name="T:Asa.IOModule.AIOBOX.AO_Changed">
<summary>
Get the error.
自动读取AO委托
</summary>
<returns>Error Code</returns>
<param name="box">AIOBOX</param>
<param name="val">所有AO的值</param>
</member>
<member name="P:OMLib.Communication.ModbusInfo.SendReceiveData.Query">
<member name="E:Asa.IOModule.AIOBOX.AO_Changed_Event">
<summary>
Query
自动读取AO事件触发
</summary>
</member>
<member name="P:OMLib.Communication.ModbusInfo.SendReceiveData.Response">
<member name="M:Asa.IOModule.AIOBOX.#ctor">
<summary>
Response
AIOBOX
</summary>
</member>
<member name="P:OMLib.Communication.ModbusInfo.SendReceiveData.IsError">
<member name="P:Asa.IOModule.AIOBOX.IP">
<summary>
If an error has occurred, return true.
IP地址
</summary>
</member>
<member name="T:OMLib.Communication.Modbus">
<member name="P:Asa.IOModule.AIOBOX.Port">
<summary>
Represents a modbus resource.
ModBus端口
</summary>
</member>
<member name="M:OMLib.Communication.Modbus.SetProduct(OMLib.PRODUCT)">
<member name="P:Asa.IOModule.AIOBOX.IsConn">
<summary>
Set the product.
是否连接
</summary>
<param name="product">Type of product</param>
</member>
<member name="M:OMLib.Communication.Modbus.GetProduct">
<member name="P:Asa.IOModule.AIOBOX.ErrInfo">
<summary>
Get the current product setting.
错误信息
</summary>
<returns>product</returns>
</member>
<member name="M:OMLib.Communication.Modbus.SendReadHolding(OMLib.Communication.ModbusInfo.SendReceiveData@,System.Byte,System.UInt16,System.UInt16)">
<member name="P:Asa.IOModule.AIOBOX.LogOutDir">
<summary>
Run the reading from a holding register(s).
日志输出目录
</summary>
<param name="response">Store the information of query and response</param>
<param name="slvadd">Slave Address</param>
<param name="startaddress">Register address to start reading from</param>
<param name="number">Number of registers to be read from the starting register address</param>
<returns>Error code</returns>
</member>
<member name="M:OMLib.Communication.Modbus.SendWriteHolding(OMLib.Communication.ModbusInfo.SendReceiveData@,System.Byte,System.UInt16,System.UInt16)">
<member name="P:Asa.IOModule.AIOBOX.LogOut">
<summary>
Run the writing to a holding register.
错误日志输出,默认true
</summary>
<param name="response">Store the information of query and response</param>
<param name="slvadd">Slave Address</param>
<param name="address">Register address to be written</param>
<param name="value">Value written to the register address</param>
<returns>Error code</returns>
</member>
<member name="M:OMLib.Communication.Modbus.SendDiagnosis(OMLib.Communication.ModbusInfo.SendReceiveData@,System.Byte,System.UInt16)">
<member name="P:Asa.IOModule.AIOBOX.InputCount">
<summary>
Run the diagnosis.
输入总数
</summary>
<param name="response">Store the information of query and response</param>
<param name="slvadd">Slave Address</param>
<param name="data">Arbitrary data</param>
<returns>Error code</returns>
</member>
<member name="M:OMLib.Communication.Modbus.SendWriteMultipleHolding(OMLib.Communication.ModbusInfo.SendReceiveData@,System.Byte,System.UInt16,System.Collections.Generic.IEnumerable{System.UInt16})">
<member name="P:Asa.IOModule.AIOBOX.OutputCount">
<summary>
Run the writing to multiple holding registers.
输出总数
</summary>
<param name="response">Store the information of query and response</param>
<param name="slvadd">Slave Address</param>
<param name="startaddress">Register address to be written</param>
<param name="values">Value written to the register address</param>
<returns>Error code</returns>
</member>
<member name="M:OMLib.Communication.Modbus.PortOpen(System.String,System.Int32,System.IO.Ports.Parity,System.IO.Ports.StopBits)">
<member name="P:Asa.IOModule.AIOBOX.InputReadSleep">
<summary>
open the serial port.
自动读取DI间隔
</summary>
<param name="portnum">Port Number</param>
<param name="baudrate">BaudRate</param>
<param name="parity">Parity</param>
<param name="stopbits">StopBits</param>
<returns>Error Code</returns>
</member>
<member name="M:OMLib.Communication.Modbus.PortClose">
<member name="P:Asa.IOModule.AIOBOX.OutputReadSleep">
<summary>
close the serial port.
自动读取DO间隔
</summary>
<returns>If successful, it returns true</returns>
</member>
<member name="M:OMLib.Communication.Modbus.IsPortOpen">
<member name="M:Asa.IOModule.AIOBOX.SetInput(Asa.IOModule.Box_Type,System.Int32)">
<summary>
Gets a value indicating the open or closed status of the Modbus object.
设置输入端
</summary>
<returns>true if the serial port is open; otherwise, false. The default is false.</returns>
<param name="type">类型</param>
<param name="count">数量</param>
</member>
<member name="M:OMLib.Communication.Modbus.IsBusyCommunication">
<member name="M:Asa.IOModule.AIOBOX.SetOutput(Asa.IOModule.Box_Type,System.Int32)">
<summary>
Indicates whether communication
设置输出端
</summary>
<returns>Returns true if the communication.</returns>
<param name="type">类型</param>
<param name="count">数量</param>
</member>
<member name="M:OMLib.Communication.Modbus.SetReceiveTimeout(System.UInt32)">
<member name="M:Asa.IOModule.AIOBOX.AutoIP(System.String)">
<summary>
Set the receive timeout.
自动获取IP地址,未连接前使用,必须在同一网段
</summary>
<param name="time">time[ms]</param>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.SetReceiveCompleteTimeout(System.UInt32)">
<member name="M:Asa.IOModule.AIOBOX.Connect">
<summary>
Set the receive completion timeout.
连接
</summary>
<param name="time">time[ms]</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.MoveAbsolute(System.Byte,System.Int32,System.Int32,System.UInt32,System.UInt32)">
<member name="M:Asa.IOModule.AIOBOX.Close">
<summary>
Move to absolute position
关闭连接
</summary>
<param name="axis">Slave Address</param>
<param name="position">Position</param>
<param name="velocity">Velocity</param>
<param name="speedChangeRate">start/speed change rate</param>
<param name="stopRate">stopping rate</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
</member>
<member name="M:OMLib.Communication.Modbus.MoveVelocity(System.Byte,System.Int32,System.UInt32,System.UInt32)">
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput(System.Boolean,System.Int32)">
<summary>
continuous operation
自动读取输入端,触发事件
</summary>
<param name="axis">Slave Address</param>
<param name="velocity">Velocity</param>
<param name="speedChangeRate">start/speed change rate</param>
<param name="stopRate">stopping rate</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于15ms</param>
</member>
<member name="M:OMLib.Communication.Modbus.MoveRelative(System.Byte,System.Int32,System.Int32,System.UInt32,System.UInt32)">
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput(System.Boolean,System.Int32)">
<summary>
move a specified distance from the actual position
自动读取输出端,触发事件
</summary>
<param name="axis">Slave Address</param>
<param name="position">Position</param>
<param name="velocity">Velocity</param>
<param name="speedChangeRate">start/speed change rate</param>
<param name="stopRate">stopping rate</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于10ms</param>
</member>
<member name="M:OMLib.Communication.Modbus.Home(System.Byte)">
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<summary>
start the Home operation
相反状态(ON/OFF)
</summary>
<param name="slvAdd">Slave Address</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.Stop(System.Byte)">
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32)">
<summary>
stop the operation
读取单个DI输入状态(ON/OFF)
</summary>
<param name="slvAdd">Slave Address</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">输入地址,从0开始</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.ReadActualPosition(System.Byte,System.Nullable{System.Int32}@)">
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32,System.Int32)">
<summary>
get the Feedback position
读取多个DI输入状态(ON/OFF)
</summary>
<param name="slvAdd">Slave Address</param>
<param name="position">Feedback position</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.ReadCommandPosition(System.Byte,System.Nullable{System.Int32}@)">
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Int32)">
<summary>
get the command position
读取单个AI模拟量的值
</summary>
<param name="slvAdd">Slave Address</param>
<param name="position">Command Position</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">模拟量地址,从0开始</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.ReadTargetPosition(System.Byte,System.Nullable{System.Int32}@)">
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Int32,System.Int32)">
<summary>
get the Target position
读取多个AI模拟量的值
</summary>
<param name="slvAdd">Slave Address</param>
<param name="position">Target Position</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.ReadInternalOutPutIO(System.Byte,OMLib.Products.AZSeries.AzInternalIO@)">
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Int32)">
<summary>
Read the output I/O (AZ Series)
读取单个DO输出状态(ON/OFF)
</summary>
<param name="slvAdd">Slave Address</param>
<param name="outputio">Internal Output I/O</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<exception cref="T:System.NotSupportedException"></exception>
<param name="add">输出地址,从0开始</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.GetAlarm(System.Byte,System.Int32@)">
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Int32,System.Int32)">
<summary>
Current Alarm
读取多个DO输出状态(ON/OFF)
</summary>
<param name="slvAdd">Slave Address</param>
<param name="alarm">Current alarm</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.AlarmReset(System.Byte)">
<member name="M:Asa.IOModule.AIOBOX.ReadAO(System.Int32)">
<summary>
Alarm reset
读取单个AO模拟量的值
</summary>
<param name="slvAdd">Slave Address</param>
<returns><see cref="T:OMLib.Communication.ModbusInfo.ErrorCode"/> is returned.</returns>
<param name="add">输出地址,从0开始</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.SerchDllPath(System.String,System.String)">
<member name="M:Asa.IOModule.AIOBOX.ReadAO(System.Int32,System.Int32)">
<summary>
Adds a directory to the search path used to DLL for the application.
读取多个AO模拟量的值
</summary>
<param name="x86path">directory of dll(32bit)</param>
<param name="x64path">directory of dll(64bit)</param>
<exception cref="T:System.NotSupportedException">Not support architecture that was detected.</exception>
<exception cref="T:System.DllNotFoundException">The exception that is thrown when a DLL specified in a DLL import cannot be found.</exception>
<exception cref="T:System.BadImageFormatException">The exception that is thrown when the file image of a dynamic link library (DLL) or an executable program is invalid.</exception>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.GetArchitecture">
<member name="M:Asa.IOModule.AIOBOX.WriteDO(System.Int32,Asa.IOModule.Box_Sta)">
<summary>
get the architecture
写入单个DO输出状态(ON/OFF)
</summary>
<returns>Architecture</returns>
<param name="add">输出地址,从0开始</param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:OMLib.Communication.Modbus.#ctor(OMLib.PRODUCT)">
<member name="M:Asa.IOModule.AIOBOX.GetLocalIP">
<summary>
Constructor
获取本地IPv4地址
</summary>
<param name="product">product</param>
<returns></returns>
</member>
<member name="T:OMLib.Communication.ModbusInfo.NativeStopBits">
<member name="M:Asa.IOModule.AIOBOX.Send">
<summary>
Stop Bits
发送命令
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.NativeStopBits.One">
<member name="M:Asa.IOModule.AIOBOX.Receive">
<summary>
One
接收命令
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.NativeStopBits.OnePointFive">
<member name="M:Asa.IOModule.AIOBOX.ReadSingle(System.Byte[])">
<summary>
OnePointFive
读取写入单个DO,功能码5
</summary>
<param name="buff"></param>
</member>
<member name="F:OMLib.Communication.ModbusInfo.NativeStopBits.Two">
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Byte[])">
<summary>
Two
读取所有DO状态,功能码1
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="T:OMLib.Products.AZSeries.AzInternalIO">
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Byte[])">
<summary>
Out put I/O
读取所有DI状态,功能码2
</summary>
<returns></returns>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x0178">
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Byte[])">
<summary>
Value of register address (0x0178)
读取所有AI的值,功能码4
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x0179">
<member name="M:Asa.IOModule.AIOBOX.Command">
<summary>
Value of register address (0x0179)
命令,前7个字节
</summary>
<returns></returns>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017A">
<member name="M:Asa.IOModule.AIOBOX.TriggerDIO">
<summary>
Value of register address (0x017A)
触发DIO改变事件
</summary>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017B">
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput">
<summary>
Value of register address (0x017B)
自动读取输入端线程
</summary>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017C">
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput">
<summary>
Value of register address (0x017C)
自动读取输出端线程
</summary>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017D">
<member name="M:Asa.IOModule.AIOBOX.Listen">
<summary>
Value of register address (0x017D)
监听结果线程
</summary>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017E">
<member name="T:Asa.IOModule.Box_Type">
<summary>
Value of register address (0x017E)
IO模块类型
</summary>
</member>
<member name="F:OMLib.Products.AZSeries.AzInternalIO.addr_0x017F">
<member name="F:Asa.IOModule.Box_Type.DI">
<summary>
Value of register address (0x017F)
数字信号输入
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.MAREA">
<member name="F:Asa.IOModule.Box_Type.DO">
<summary>
Output when the motor is within the area specified by each operation data.
数字信号输出
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.TIM">
<member name="F:Asa.IOModule.Box_Type.AI">
<summary>
Output once every 7.2° rotation of the motor output shaft based on command position.
模拟量输入
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.RND_ZERO">
<member name="F:Asa.IOModule.Box_Type.AO">
<summary>
Output if the motor is in the origin which is on the wrap coordinates when the warp function is enabled.
模拟量输出
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ZSG">
<member name="T:Asa.IOModule.Box_Sta">
<summary>
Turns ON every one round based on the feedback position.
IO模块寄存器状态
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.RV_SLS">
<member name="F:Asa.IOModule.Box_Sta.Off">
<summary>
Output when reached to the software limit in CCW direction.
断开,关闭,低电平
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.FW_SLS">
<member name="F:Asa.IOModule.Box_Sta.On">
<summary>
Output when reached to the software limit in CW direction.
闭合,打开,高电平
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.RND_OVF">
<member name="T:Asa.IOModule.Reg">
<summary>
The output is inverted when exceeding the wrap setting range.
IO模块寄存器
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ORGN_STLD">
<member name="F:Asa.IOModule.Reg.ID">
<summary>
Output if mechanical home which is for the product is set at the time of shipping.
标识
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PRST_STLD">
<member name="F:Asa.IOModule.Reg.Text">
<summary>
Output when mechanical home positions set.
文本,仅用于显示
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PRST_DIS">
<member name="F:Asa.IOModule.Reg.Address">
<summary>
Turns ON when the PRESET input is needed again after
寄存器地址
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ELPRST_MON">
<member name="F:Asa.IOModule.Reg.Status">
<summary>
Output when electrical home coordinate is enabled.
当前的状态
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ABSPEN">
<member name="M:Asa.IOModule.Reg.#ctor(Asa.IOModule.Box_Addr)">
<summary>
Output when the coordinate is determined
寄存器,文本空,状态OFF
</summary>
<param name="address">地址</param>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.HOME_END">
<member name="M:Asa.IOModule.Reg.#ctor(System.String,Asa.IOModule.Box_Addr)">
<summary>
Output when the high speed return-tohome operation or return-to-home operation completed, or when the position preset is executed.
寄存器,状态OFF
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AUTO_CD">
<member name="M:Asa.IOModule.Reg.#ctor(System.Int32,System.String,Asa.IOModule.Box_Addr)">
<summary>
Output when the auto current cutback function is actuated.
寄存器,状态OFF
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.CRNT">
<member name="M:Asa.IOModule.Reg.#ctor(System.String,Asa.IOModule.Box_Addr,Asa.IOModule.Box_Sta)">
<summary>
Output when the motor is excited.
寄存器
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
<param name="status">状态</param>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.VA">
<member name="M:Asa.IOModule.Reg.#ctor(System.Int32,System.String,Asa.IOModule.Box_Addr,Asa.IOModule.Box_Sta)">
<summary>
Output when the operating speed reached to the target speed.
寄存器
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="address">地址</param>
<param name="status">状态</param>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.TLC">
<member name="T:Asa.IOModule.Box_Addr">
<summary>
Output when the output torque reached to the upper limitation.
IO模块寄存器地址
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.IN_POS">
<member name="F:Asa.IOModule.Box_Addr.DI_1">
<summary>
Output when the positioning operation is completed.
输入点,DI01
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ETO_MON">
<member name="F:Asa.IOModule.Box_Addr.DI_2">
<summary>
Output when the ETO condition is present.
输入点,DI02
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.SYS_BSY">
<member name="F:Asa.IOModule.Box_Addr.DI_3">
<summary>
Output when the driver is in internal processing status.
输入点,DI03
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO">
<member name="F:Asa.IOModule.Box_Addr.DI_4">
<summary>
Output the information of the driver.
输入点,DI04
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.MOVE">
<member name="F:Asa.IOModule.Box_Addr.DI_5">
<summary>
Output when the motor is in operation.
输入点,DI05
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PLS_RDY">
<member name="F:Asa.IOModule.Box_Addr.DI_6">
<summary>
Output when the pulse input is enabled.
输入点,DI06
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.READY">
<member name="F:Asa.IOModule.Box_Addr.DI_7">
<summary>
Output when the driver is ready to operate.
输入点,DI07
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.SYS_RDY">
<member name="F:Asa.IOModule.Box_Addr.DI_8">
<summary>
Output when the control power is turned on.
输入点,DI08
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ALM_B">
<member name="F:Asa.IOModule.Box_Addr.DI_9">
<summary>
Output the alarm of the driver.(normally close)
输入点,DI09
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.ALM_A">
<member name="F:Asa.IOModule.Box_Addr.DI_10">
<summary>
Output the alarm of the driver.(normally open)
输入点,DI10
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.CONST_OFF">
<member name="F:Asa.IOModule.Box_Addr.DI_11">
<summary>
Not output.
输入点,DI11
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.USR_OUT1">
<member name="F:Asa.IOModule.Box_Addr.DI_12">
<summary>
Output the logical conjunction or disjunction of 2 types of output signals.
输入点,DI12
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.USR_OUT0">
<member name="F:Asa.IOModule.Box_Addr.DI_13">
<summary>
Output the logical conjunction or disjunction of 2 types of output signals.
输入点,DI13
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PLS_OUTR">
<member name="F:Asa.IOModule.Box_Addr.DI_14">
<summary>
Output when the pulse request function is activated.
输入点,DI14
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.MON_OUT">
<member name="F:Asa.IOModule.Box_Addr.DI_15">
<summary>
Output the information corresponding to the I/O position output function.
输入点,DI15
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.HWTOIN_MON">
<member name="F:Asa.IOModule.Box_Addr.DI_16">
<summary>
Output when either one of the HWTO1 and HWTO2 turned OFF.
输入点,DI16
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.EDM">
<member name="F:Asa.IOModule.Box_Addr.DO_1">
<summary>
Output when both the HWTO1 and 2 inputs are OFF.
输出点,DO01
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.RG">
<member name="F:Asa.IOModule.Box_Addr.DO_2">
<summary>
Output when the product is in regenerative condition.
输出点,DO02
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.MBC">
<member name="F:Asa.IOModule.Box_Addr.DO_3">
<summary>
Output when electromagnetic brake is locked.
输出点,DO03
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.MPS">
<member name="F:Asa.IOModule.Box_Addr.DO_4">
<summary>
Output when the main power is turned ON.
输出点,DO04
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA7">
<member name="F:Asa.IOModule.Box_Addr.DO_5">
<summary>
Output when the motor is within the AREA.
输出点,DO05
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA6">
<member name="F:Asa.IOModule.Box_Addr.DO_6">
<summary>
Output when the motor is within the AREA.
输出点,DO06
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA5">
<member name="F:Asa.IOModule.Box_Addr.DO_7">
<summary>
Output when the motor is within the AREA.
输出点,DO07
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA4">
<member name="F:Asa.IOModule.Box_Addr.DO_8">
<summary>
Output when the motor is within the AREA.
输出点,DO08
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA3">
<member name="F:Asa.IOModule.Box_Addr.DO_9">
<summary>
Output when the motor is within the AREA.
输出点,DO09
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA2">
<member name="F:Asa.IOModule.Box_Addr.DO_10">
<summary>
Output when the motor is within the AREA.
输出点,DO10
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA1">
<member name="F:Asa.IOModule.Box_Addr.DO_11">
<summary>
Output when the motor is within the AREA.
输出点,DO11
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.AREA0">
<member name="F:Asa.IOModule.Box_Addr.DO_12">
<summary>
Output when the motor is within the AREA.
输出点,DO12
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END7">
<member name="F:Asa.IOModule.Box_Addr.DO_13">
<summary>
Output when the specified operation data is completed.
输出点,DO13
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END6">
<member name="F:Asa.IOModule.Box_Addr.DO_14">
<summary>
Output when the specified operation data is completed.
输出点,DO14
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END5">
<member name="F:Asa.IOModule.Box_Addr.DO_15">
<summary>
Output when the specified operation data is completed.
输出点,DO15
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END4">
<member name="F:Asa.IOModule.Box_Addr.DO_16">
<summary>
Output when the specified operation data is completed.
输出点,DO16
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END3">
<member name="F:Asa.IOModule.Box_Addr.NONE">
<summary>
Output when the specified operation data is completed.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END2">
<member name="T:Asa.IOModule.DI_Addr">
<summary>
Output when the specified operation data is completed.
输入端地址
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END1">
<member name="T:Asa.IOModule.DO_Addr">
<summary>
Output when the specified operation data is completed.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.D_END0">
<summary>
Output when the specified operation data is completed.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT7">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT6">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT5">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT4">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT3">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT2">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT1">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_ACT0">
<summary>
Output the conditions of the M0 to M7 inputs corresponding to the current operation No. during operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.M_CHG">
<summary>
The output inverts when operation data No. is transited.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.DCMD_FULL">
<summary>
Output when data is written in the buffer area of the direct data operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.DCMD_RDY">
<summary>
Output when the direct data operation is ready.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PLS_LOST">
<summary>
Output if pulse is input when the pulse input function is disabled.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.NEXT_LAT">
<summary>
Output when the operation was transited by the NEXT input.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.JUMP1_LAT">
<summary>
Output when high event trigger is detected
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.JUMP0_LAT">
<summary>
Output when low event trigger is detected
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.DELAY_BSY">
<summary>
Output when the driver is in stop waiting condition (delay, dwell).
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.SEQ_BSY">
<summary>
Output during the stored data operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.PAUSE_BSY">
<summary>
Output at pause status.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.OPE_BSY">
<summary>
Output when the driver is in internal processing status.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.SPD_LMTD">
<summary>
Output when the speed is limited.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.CRNT_LMTD">
<summary>
Output when the current is limited.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_RBT">
<summary>
Reboot was requested.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_CFG">
<summary>
Configuration was requested.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_IOTEST">
<summary>
<list type="bullet">
<item>
<description>“I/O test” of the MEXE02 has been performed.</description>
</item>
<item>
<description>Configuration was executed.</description>
</item>
</list>
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_DSLMTD">
<summary>
<list type="bullet">
<item>
<description>“Teaching remote operation“ of the MEXE02 was activated.</description>
</item>
<item>
<description>Configuration was executed.</description>
</item>
</list>
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_ODO">
<summary>
Odometer of the motor exceeded the value set in the “Odometer information (INFO-ODO)” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_TRIP">
<summary>
Tripmeter of the motor exceeded the value set in the “Tripmeter information (INFO-TRIP)” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_CULD1">
<summary>
Cumulative load exceeded the value set in the “Cumulative load information (INFO-CULD1)” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_CULD0">
<summary>
Cumulative load exceeded the value set in the “Cumulative load information (INFO-CULD0)” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_RV_OT">
<summary>
Negative software limit was detected, or either one of the RV-LS input and RV-BLK input turned ON.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_FW_OT">
<summary>
Positive software limit was detected, or either one of the FW-LS input and FWBLK input turned ON.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_NET_E">
<summary>
RS-485 communication error was detected.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_RND_E">
<summary>
The resolution and "wrap setting range" parameter was inconsistent.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_EGR_E">
<summary>
Resolution set in the “electronic gear” parameter was out of specification.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_PR_REQ">
<summary>
Preset has been executed by position preset or return-to-home operation.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_ZHOME">
<summary>
Turn on the ZHOME input without the setting the coordinate(ABSPEN output is OFF)
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_START">
<summary>
<list type="bullet">
<item>
<description>Start input of prohibited direction has been turned ON.</description>
</item>
<item>
<description>When the operation cannot be executed, start signal has been turned ON. Example) the READY output is OFF</description>
</item>
</list>
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_SPD">
<summary>
The detected motor speed exceeded the value set in the “speed information” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_OLTIME">
<summary>
A load exceeding the maximum torque was applied for the time set in parameter for the overload time information or longer.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_UVOLT">
<summary>
<list type="bullet">
<item>
<description>The power supply voltage dropped from the value set in the parameter for undervoltage.</description>
</item>
<item>
<description>The main power was cut off momentarily or the voltage became low.</description>
</item>
</list>
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_OVOLT">
<summary>
<list type="bullet">
<item>
<description>The voltage of the power supply exceeded the value set in the "over voltage information" parameter.</description>
</item>
<item>
<description>A large inertial load was stopped abruptly or vertical operation was performed.</description>
</item>
</list>
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_MTRTMP">
<summary>
Detected encoder temperature exceeded the value set in the “motor temperature information” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_DRVTMP">
<summary>
Driver internal temperature exceeded the value set in the “driver temperature information” parameter.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_POSERR">
<summary>
Position deviation between the command position and feedback position exceeds the value set in the “overflow rotation information”.
</summary>
</member>
<member name="P:OMLib.Products.AZSeries.AzInternalIO.INFO_USRIO">
<summary>
The I/O set in the “INFO-B0 output selection” parameter turns ON.
</summary>
</member>
<member name="T:OMLib.Communication.ModbusInfo.ErrorCode">
<summary>
Error Code.
Each function of the return value.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_NONE">
<summary>
Error is not.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_UNKNOWN">
<summary>
Undefined error.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_FRAMELENGTH">
<summary>
Frame length is abnormal.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_DIFFERENT_SLAVEADDRESS">
<summary>
Slave address is different.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_UNKNOWN_FUNCTIONCODE">
<summary>
Unknown Function code.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_CRC">
<summary>
Anomaly of the CRC.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_RESPONSEFRAME">
<summary>
Response frame is abnormal.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_TIMEOUT_SEND">
<summary>
Time-out of the transmission occurs.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_TIMEOUT_RECEIVE">
<summary>
Time-out of the reception occurs.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_FAIL_INITSERIALTHREAD">
<summary>
An error occurred when initializing the thread of serial communication.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_OCCUREXCEPTION_SERIAL">
<summary>
An error occurred when processing of serial communication.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_SERIALPORTNAME">
<summary>
Port name is abnormal.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_PORTHANDLE">
<summary>
Failed to get the port handle.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_COMMUNICATIONBUFFER">
<summary>
Failed to set send and receive buffer.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_CLEARCOMMUNICATIONBUFFER">
<summary>
Failed to clear send and receive buffer.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_SETSERIALSTATE">
<summary>
Failed to set the status.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_SETSERIALTIMEOUT">
<summary>
Failed to set the time-out.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_OCCUREXCEPTION_SERIALINIT">
<summary>
An error occurred when initialize the serial communication.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_SERIALPORTNOTOPEN">
<summary>
Port is not open.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_RECEIVETHREAD">
<summary>
An error occurred when running the thread of the reception.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_FAIL_GETSEMAPHORE">
<summary>
Failed to get the semaphore.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_NOT_OPERATION">
<summary>
The driver side is not in operation possible state.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_INPROGRESS_COMMAND">
<summary>
Other command is running.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_INPROGRESS_SERIALPORT">
<summary>
During communication.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_UNKNOWN_EXCEPTIONCODE">
<summary>
Unknown Exception Code
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.ERROR_BROADCAST">
<summary>
Can not be broadcast.
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.DRIVER_EXCEPTION_INVALIDFUNCTION">
<summary>
Exception response : Exception Code = 0x01
<list type="bullet">
<item><description>The process could not be executed because the function code was invalid.</description></item>
</list>
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.DRIVER_EXCEPTION_INVALIDDATAADDR">
<summary>
Exception response : Exception Code = 0x02
<list type="bullet">
<item><description>The process could not be executed because the data address was invalid.</description></item>
</list>
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.DRIVER_EXCEPTION_INVALIDDATA">
<summary>
Exception response : Exception Code = 0x03
<list type="bullet">
<item><description>The process could not be executed because the data was invalid.</description></item>
</list>
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.ErrorCode.DRIVER_EXCEPTION_SLAVEERROR">
<summary>
Exception response : Exception Code = 0x04
<list type="bullet">
<item><description>Communication with user I/F is in progress.</description></item>
<item><description>Non-volatile memory processing is in progress.</description></item>
<item><description>Outside the parameter setting range.</description></item>
<item><description>Command execute disable.</description></item>
</list>
</summary>
</member>
<member name="F:OMLib.Communication.ModbusInfo.NativeMethod.DllName">
<summary>
*.dll of name
</summary>
</member>
<member name="T:OMLib.PRODUCT">
<summary>
Supported products by Modbus Library.
</summary>
</member>
<member name="F:OMLib.PRODUCT.UnKnown">
<summary>
Unknown product
</summary>
</member>
<member name="F:OMLib.PRODUCT.AZ">
<summary>
AZ series
</summary>
</member>
<member name="F:OMLib.PRODUCT.AR">
<summary>
AR series
输入端地址
</summary>
</member>
</members>
......
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
......@@ -20,31 +20,30 @@
<add key="Store_Position_Config" value="\StoreConfig\AC\linePositions.csv"/>
<add key="Store_ConfigPath" value="\StoreConfig\AC\StoreConfig.csv"/>
<add key="Store_Type" value="RC_AC_SA"/>
<add key="Store_CID" value="rc29ac-1"/>
<add key="Store_CID" value="rc1258ac-1"/>
<!--end one store config-->
<!--摄像机名称列表配置,用#分割-->
<add key="CameraName" value="GigE:MV-CE100-30GC (00C69898483)"/>
<!--二维码类型列表配置,用#分割,一维码=Barcode-->
<add key="CodeType" value="QR Code#Data Matrix ECC 200#Micro QR Code"/>
<!--<add key="CodeType" value="Data Matrix ECC 200"/>-->
<!--二维码类型列表配置,用#分割,二维码:QR Code#Data Matrix ECC 200#Micro QR Code,一维码=Barcode-->
<add key="CodeType" value="QR Code"/>
<!--二维码参数文件所在路径,文件名与二维码类型名一样-->
<add key="CodeParamPath" value="\CodeParam\"/>
<add key="AI_ConvertPosition" value="55"/>
<add key="CodeParamPath" value="\CodeParam\"/>
<add key="InOutDefaultPosition" value="8000"/>
<add key="Config_Pwd" value="123456"/>
<!--出库等待料盘拿走的时间,秒-->
<add key="OutStoreWaitSeconds" value="10"/>
<!--压紧轴计量检测亮一次的脉冲-->
<add key="ComAxisChangeValue" value="2400"/>
<add key="OutStoreWaitSeconds" value="10"/>
<!--温控器类型,0=壁挂王字壳温湿度变送器,1=妙昕温湿度记录仪-->
<add key="HumitureControllerType" value="1"/>
<!--流水线地址和端口配置-->
<add key="LineServerIp" value="192.168.200.69"/>
<add key="LineServerPort" value="1234"/>
<!--解码方式,0=halcon 解码,1=西安料仓 使用zxing解码,2=成都料仓-->
<add key="DeCodeType" value="2"/>
<add key="DeCodeType" value="0"/>
<add key ="DefaultPWD" value ="123456"/>
<add key="UseAIOBOX" value="1"/>
<!--是否使用蜂鸣器-->
<add key ="UseBuzzer" value ="1"/>
</appSettings>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
......
......@@ -244,7 +244,7 @@
this.btnComMovej.Name = "btnComMovej";
this.btnComMovej.Size = new System.Drawing.Size(131, 36);
this.btnComMovej.TabIndex = 25;
this.btnComMovej.Text = "压紧轴-(向)";
this.btnComMovej.Text = "压紧轴-(向)";
this.btnComMovej.UseVisualStyleBackColor = false;
this.btnComMovej.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnComMovej_MouseDown);
this.btnComMovej.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnComMovej_MouseUp);
......@@ -256,7 +256,7 @@
this.btnComMove.Name = "btnComMove";
this.btnComMove.Size = new System.Drawing.Size(131, 36);
this.btnComMove.TabIndex = 24;
this.btnComMove.Text = "压紧轴+(向)";
this.btnComMove.Text = "压紧轴+(向)";
this.btnComMove.UseVisualStyleBackColor = false;
this.btnComMove.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnComMove_MouseDown);
this.btnComMove.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnComMove_MouseUp);
......
......@@ -23,17 +23,19 @@ namespace OnlineStore.ACSingleStore
private ConfigMoveAxis updown = null;
//private ConfigMoveAxis compress = null;
private ConfigMoveAxis inout = null;
private int compress_Slv = 0;
private ConfigMoveAxis comp = null;
//private int compress_Slv = 0;
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public FrmAxisDebug(AC_SA_BoxBean boxBean)
{
middle = boxBean.Config.Middle_Axis;
updown = boxBean.Config.UpDown_Axis;
compress_Slv = boxBean.Config.CompressAxis_Slv;
//compress_Slv = boxBean.Config.CompressAxis_Slv;
comp = boxBean.Config.Comp_Axis;
inout = boxBean.Config.InOut_Axis;
InitializeComponent();
txtComSpeed.Text = boxBean.Config.CompressAxis_EndSpeed.ToString();
this.Text = boxBean.StoreName + "_轴点动调试";
}
......@@ -45,10 +47,11 @@ namespace OnlineStore.ACSingleStore
}
private void FrmAxisDebug_Load(object sender, EventArgs e)
{
// ACServerManager.ClearSpeed();
txtMiddleSpeed.Text = (middle.TargetSpeed / 5).ToString();
txtInOutSpeed.Text = (inout.TargetSpeed / 5).ToString();
txtUpDownSpeed.Text = (updown.TargetSpeed / 5).ToString();
txtComSpeed.Text = (StoreManager.Config.CompressAxis_EndSpeed).ToString();
txtComSpeed.Text = (comp.TargetSpeed / 5).ToString();
timer1.Start();
}
/// <summary>
......@@ -61,7 +64,7 @@ namespace OnlineStore.ACSingleStore
//{
// InOutDefaultPosition = 3000;
//}
int currValue = ACServerManager.GetActualtPosition(inout.DeviceName, inout.GetAxisValue());
int currValue = ACServerManager.GetActualtPosition(inout.DeviceName, inout.GetAxisValue());
if (currValue <= InOutDefaultPosition)
{
return true;
......@@ -75,7 +78,7 @@ namespace OnlineStore.ACSingleStore
{
return;
}
if (btnMiddleMove.BackColor.Equals(System.Drawing.SystemColors.Control))
{
int speed = FormUtil.GetIntValue(txtMiddleSpeed);
......@@ -122,7 +125,7 @@ namespace OnlineStore.ACSingleStore
{
if (btnUpDownMove.BackColor == Color.Green)
{
btnUpDownMove.BackColor = System.Drawing.SystemColors.Control;
btnUpDownMove.BackColor = System.Drawing.SystemColors.Control;
ACServerManager.SuddenStop(updown.DeviceName, updown.GetAxisValue());
UpdateUpdownPosition();
}
......@@ -130,7 +133,7 @@ namespace OnlineStore.ACSingleStore
private void btnInOutMove_MouseDown(object sender, MouseEventArgs e)
{
if (this.btnInOutMove.BackColor .Equals(System.Drawing.SystemColors.Control))
if (this.btnInOutMove.BackColor.Equals(System.Drawing.SystemColors.Control))
{
if (StoreManager.Store.InOutAxisCanMove().Equals(false))
{
......@@ -156,7 +159,7 @@ namespace OnlineStore.ACSingleStore
ACServerManager.SuddenStop(inout.DeviceName, inout.GetAxisValue());
UpdateInOutPosition();
}
}
}
private void btnMiddleMovej_MouseDown(object sender, MouseEventArgs e)
{
if (!InOutIsIsP1())
......@@ -192,7 +195,7 @@ namespace OnlineStore.ACSingleStore
{
return;
}
if (btnUpDownMovej.BackColor .Equals( System.Drawing.SystemColors.Control))
if (btnUpDownMovej.BackColor.Equals(System.Drawing.SystemColors.Control))
{
int speed = FormUtil.GetIntValue(txtUpDownSpeed);
if (speed <= 0)
......@@ -242,7 +245,7 @@ namespace OnlineStore.ACSingleStore
btnInOutMovej.BackColor = System.Drawing.SystemColors.Control;
ACServerManager.SuddenStop(inout.DeviceName, inout.GetAxisValue());
UpdateInOutPosition();
}
}
}
private void btnComMove_MouseDown(object sender, MouseEventArgs e)
{
......@@ -255,10 +258,7 @@ namespace OnlineStore.ACSingleStore
return;
}
this.btnComMove.BackColor = Color.Green;
ShuoKeControls.SetSpeed(compress_Slv, ShuoKeCMD.SetEndSpeed, speed);
ShuoKeControls.SetSpeed(compress_Slv, ShuoKeCMD.SetMaxSpeed, speed);
ShuoKeControls.VolMove(compress_Slv, speed);
AxisMove(comp, speed);
}
}
......@@ -266,9 +266,9 @@ namespace OnlineStore.ACSingleStore
{
if (this.btnComMove.BackColor == Color.Green)
{
btnComMove.BackColor = System.Drawing.SystemColors.Control;
ShuoKeControls.SuddownStop(compress_Slv);
ShuoKeControls.GetABSPosition(compress_Slv);
btnComMove.BackColor = System.Drawing.SystemColors.Control;
ACServerManager.SuddenStop(comp.DeviceName, comp.GetAxisValue());
UpdateCompPosition();
}
}
private void btnComMovej_MouseDown(object sender, MouseEventArgs e)
......@@ -279,10 +279,8 @@ namespace OnlineStore.ACSingleStore
MessageBox.Show("提示", "请先输入正确的速度");
return;
}
this.btnComMovej.BackColor = Color.Green;
ShuoKeControls.SetSpeed(compress_Slv, ShuoKeCMD.SetEndSpeed, speed);
ShuoKeControls.SetSpeed(compress_Slv, ShuoKeCMD.SetMaxSpeed, speed);
ShuoKeControls.VolMove(compress_Slv,-speed);
this.btnComMovej.BackColor = Color.Green;
AxisMove(comp, -speed);
}
private void btnComMovej_MouseUp(object sender, MouseEventArgs e)
......@@ -290,8 +288,8 @@ namespace OnlineStore.ACSingleStore
if (btnComMovej.BackColor.Equals(Color.Green))
{
btnComMovej.BackColor = System.Drawing.SystemColors.Control;
ShuoKeControls.SuddownStop(compress_Slv);
txtComPosition.Text = ShuoKeControls.GetABSPosition(compress_Slv).ToString();
ACServerManager.SuddenStop(comp.DeviceName, comp.GetAxisValue());
UpdateCompPosition();
}
}
......@@ -299,11 +297,10 @@ namespace OnlineStore.ACSingleStore
{
this.Close();
}
private void FrmAxisDebug_Shown(object sender, EventArgs e)
{
SetSkin(this);
{
}
private void timer1_Tick(object sender, EventArgs e)
......@@ -313,10 +310,18 @@ namespace OnlineStore.ACSingleStore
UpdateMiddlePosition();
UpdateInOutPosition();
UpdateUpdownPosition();
// txtComPosition.Text = ShuoKeControls.GetLastPosition(compress_Slv).ToString();
UpdateCompPosition();
// txtComPosition.Text = ShuoKeControls.GetLastPosition(compress_Slv).ToString();
}
}
private void UpdateCompPosition()
{
int compPosition = ACServerManager.GetTargetPosition(comp.DeviceName, comp.GetAxisValue());
if (!txtComPosition.Text.Equals(compPosition.ToString()))
{
txtComPosition.Text = compPosition.ToString();
}
}
private void UpdateUpdownPosition()
{
int updownPosition = ACServerManager.GetTargetPosition(updown.DeviceName, updown.GetAxisValue());
......
namespace OnlineStore.ACSingleStore
{
partial class FrmAxisMoveConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAxisMoveConfig));
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.txtDelSpeed = new System.Windows.Forms.TextBox();
this.label19 = new System.Windows.Forms.Label();
this.lblShuoKePort = new System.Windows.Forms.Label();
this.txtBeginSpeed = new System.Windows.Forms.TextBox();
this.txtAddSpeed = new System.Windows.Forms.TextBox();
this.lblShuoKeAdd = new System.Windows.Forms.Label();
this.txtTargetSpeed = new System.Windows.Forms.TextBox();
this.label20 = new System.Windows.Forms.Label();
this.label21 = new System.Windows.Forms.Label();
this.txtMaxSpeed = new System.Windows.Forms.TextBox();
this.label18 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.txtInoutMax = new System.Windows.Forms.TextBox();
this.txtUpdownMax = new System.Windows.Forms.TextBox();
this.txtMiddleMax = new System.Windows.Forms.TextBox();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.txtInoutMin = new System.Windows.Forms.TextBox();
this.txtUpdownMin = new System.Windows.Forms.TextBox();
this.txtMiddleMin = new System.Windows.Forms.TextBox();
this.label15 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label10 = new System.Windows.Forms.Label();
this.txtIRSpeed = new System.Windows.Forms.TextBox();
this.txtURSpeed = new System.Windows.Forms.TextBox();
this.txtMRSpeed = new System.Windows.Forms.TextBox();
this.label9 = new System.Windows.Forms.Label();
this.txtIDtime = new System.Windows.Forms.TextBox();
this.txtUDtime = new System.Windows.Forms.TextBox();
this.txtMDtime = new System.Windows.Forms.TextBox();
this.txtIAtime = new System.Windows.Forms.TextBox();
this.txtUAtime = new System.Windows.Forms.TextBox();
this.txtMAtime = new System.Windows.Forms.TextBox();
this.txtISpeed = new System.Windows.Forms.TextBox();
this.txtUSpeed = new System.Windows.Forms.TextBox();
this.txtMSpeed = new System.Windows.Forms.TextBox();
this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.txtInOutSpeed = new System.Windows.Forms.TextBox();
this.txtUpDownSpeed = new System.Windows.Forms.TextBox();
this.txtMiddleSpeed = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.label1 = new System.Windows.Forms.Label();
this.label67 = new System.Windows.Forms.Label();
this.txtInOutP3S = new System.Windows.Forms.TextBox();
this.label61 = new System.Windows.Forms.Label();
this.txtInOutP2S = new System.Windows.Forms.TextBox();
this.label62 = new System.Windows.Forms.Label();
this.txtInOutP1S = new System.Windows.Forms.TextBox();
this.label63 = new System.Windows.Forms.Label();
this.txtMiddleP2S = new System.Windows.Forms.TextBox();
this.label60 = new System.Windows.Forms.Label();
this.txtMiddleP1S = new System.Windows.Forms.TextBox();
this.label58 = new System.Windows.Forms.Label();
this.txtUpdownP8S = new System.Windows.Forms.TextBox();
this.label57 = new System.Windows.Forms.Label();
this.txtUpdownP7S = new System.Windows.Forms.TextBox();
this.label56 = new System.Windows.Forms.Label();
this.txtUpdownP6S = new System.Windows.Forms.TextBox();
this.label55 = new System.Windows.Forms.Label();
this.txtUpdownP5S = new System.Windows.Forms.TextBox();
this.label54 = new System.Windows.Forms.Label();
this.txtUpdownP4S = new System.Windows.Forms.TextBox();
this.label52 = new System.Windows.Forms.Label();
this.txtUpdownP3S = new System.Windows.Forms.TextBox();
this.label51 = new System.Windows.Forms.Label();
this.txtUpdownP2S = new System.Windows.Forms.TextBox();
this.label50 = new System.Windows.Forms.Label();
this.txtUpdownP1S = new System.Windows.Forms.TextBox();
this.label53 = new System.Windows.Forms.Label();
this.btnSaveAxisSpeed = new System.Windows.Forms.Button();
this.groupBox3.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox4.SuspendLayout();
this.SuspendLayout();
//
// groupBox3
//
this.groupBox3.Controls.Add(this.txtDelSpeed);
this.groupBox3.Controls.Add(this.label19);
this.groupBox3.Controls.Add(this.lblShuoKePort);
this.groupBox3.Controls.Add(this.txtBeginSpeed);
this.groupBox3.Controls.Add(this.txtAddSpeed);
this.groupBox3.Controls.Add(this.lblShuoKeAdd);
this.groupBox3.Controls.Add(this.txtTargetSpeed);
this.groupBox3.Controls.Add(this.label20);
this.groupBox3.Controls.Add(this.label21);
this.groupBox3.Controls.Add(this.txtMaxSpeed);
this.groupBox3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox3.Location = new System.Drawing.Point(586, 227);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(210, 194);
this.groupBox3.TabIndex = 225;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "压紧轴速度设置";
//
// txtDelSpeed
//
this.txtDelSpeed.Location = new System.Drawing.Point(94, 158);
this.txtDelSpeed.Name = "txtDelSpeed";
this.txtDelSpeed.Size = new System.Drawing.Size(100, 23);
this.txtDelSpeed.TabIndex = 234;
//
// label19
//
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(16, 162);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(56, 17);
this.label19.TabIndex = 233;
this.label19.Text = "减速度:";
//
// lblShuoKePort
//
this.lblShuoKePort.AutoSize = true;
this.lblShuoKePort.Location = new System.Drawing.Point(16, 26);
this.lblShuoKePort.Name = "lblShuoKePort";
this.lblShuoKePort.Size = new System.Drawing.Size(68, 17);
this.lblShuoKePort.TabIndex = 225;
this.lblShuoKePort.Text = "起始速度:";
//
// txtBeginSpeed
//
this.txtBeginSpeed.Location = new System.Drawing.Point(94, 22);
this.txtBeginSpeed.Name = "txtBeginSpeed";
this.txtBeginSpeed.Size = new System.Drawing.Size(100, 23);
this.txtBeginSpeed.TabIndex = 226;
//
// txtAddSpeed
//
this.txtAddSpeed.Location = new System.Drawing.Point(94, 124);
this.txtAddSpeed.Name = "txtAddSpeed";
this.txtAddSpeed.Size = new System.Drawing.Size(100, 23);
this.txtAddSpeed.TabIndex = 232;
//
// lblShuoKeAdd
//
this.lblShuoKeAdd.AutoSize = true;
this.lblShuoKeAdd.Location = new System.Drawing.Point(15, 60);
this.lblShuoKeAdd.Name = "lblShuoKeAdd";
this.lblShuoKeAdd.Size = new System.Drawing.Size(68, 17);
this.lblShuoKeAdd.TabIndex = 227;
this.lblShuoKeAdd.Text = "目标速度:";
//
// txtTargetSpeed
//
this.txtTargetSpeed.Location = new System.Drawing.Point(94, 56);
this.txtTargetSpeed.Name = "txtTargetSpeed";
this.txtTargetSpeed.Size = new System.Drawing.Size(100, 23);
this.txtTargetSpeed.TabIndex = 228;
//
// label20
//
this.label20.AutoSize = true;
this.label20.Location = new System.Drawing.Point(15, 128);
this.label20.Name = "label20";
this.label20.Size = new System.Drawing.Size(56, 17);
this.label20.TabIndex = 231;
this.label20.Text = "加速度:";
//
// label21
//
this.label21.AutoSize = true;
this.label21.Location = new System.Drawing.Point(15, 94);
this.label21.Name = "label21";
this.label21.Size = new System.Drawing.Size(68, 17);
this.label21.TabIndex = 229;
this.label21.Text = "最大速度:";
//
// txtMaxSpeed
//
this.txtMaxSpeed.Location = new System.Drawing.Point(94, 90);
this.txtMaxSpeed.Name = "txtMaxSpeed";
this.txtMaxSpeed.Size = new System.Drawing.Size(100, 23);
this.txtMaxSpeed.TabIndex = 230;
//
// label18
//
this.label18.AutoSize = true;
this.label18.ForeColor = System.Drawing.Color.Red;
this.label18.Location = new System.Drawing.Point(493, 45);
this.label18.Name = "label18";
this.label18.Size = new System.Drawing.Size(227, 12);
this.label18.TabIndex = 224;
this.label18.Text = "*速度倍率为20时支持的最大速度为327660";
//
// label11
//
this.label11.AutoSize = true;
this.label11.ForeColor = System.Drawing.Color.Red;
this.label11.Location = new System.Drawing.Point(493, 21);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(227, 12);
this.label11.TabIndex = 223;
this.label11.Text = "*速度倍率为10时支持的最大速度为163830";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.txtInoutMax);
this.groupBox2.Controls.Add(this.txtUpdownMax);
this.groupBox2.Controls.Add(this.txtMiddleMax);
this.groupBox2.Controls.Add(this.label12);
this.groupBox2.Controls.Add(this.label13);
this.groupBox2.Controls.Add(this.txtInoutMin);
this.groupBox2.Controls.Add(this.txtUpdownMin);
this.groupBox2.Controls.Add(this.txtMiddleMin);
this.groupBox2.Controls.Add(this.label15);
this.groupBox2.Controls.Add(this.label16);
this.groupBox2.Controls.Add(this.label17);
this.groupBox2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox2.Location = new System.Drawing.Point(38, 419);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(368, 147);
this.groupBox2.TabIndex = 222;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "出入库脉冲误差范围";
//
// txtInoutMax
//
this.txtInoutMax.Location = new System.Drawing.Point(243, 107);
this.txtInoutMax.Name = "txtInoutMax";
this.txtInoutMax.Size = new System.Drawing.Size(92, 23);
this.txtInoutMax.TabIndex = 22;
//
// txtUpdownMax
//
this.txtUpdownMax.Location = new System.Drawing.Point(243, 75);
this.txtUpdownMax.Name = "txtUpdownMax";
this.txtUpdownMax.Size = new System.Drawing.Size(92, 23);
this.txtUpdownMax.TabIndex = 21;
//
// txtMiddleMax
//
this.txtMiddleMax.Location = new System.Drawing.Point(243, 45);
this.txtMiddleMax.Name = "txtMiddleMax";
this.txtMiddleMax.Size = new System.Drawing.Size(92, 23);
this.txtMiddleMax.TabIndex = 20;
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(257, 21);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(68, 17);
this.label12.TabIndex = 18;
this.label12.Text = "最大误差值";
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(136, 21);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(68, 17);
this.label13.TabIndex = 17;
this.label13.Text = "最小误差值";
//
// txtInoutMin
//
this.txtInoutMin.Location = new System.Drawing.Point(133, 107);
this.txtInoutMin.Name = "txtInoutMin";
this.txtInoutMin.Size = new System.Drawing.Size(92, 23);
this.txtInoutMin.TabIndex = 15;
//
// txtUpdownMin
//
this.txtUpdownMin.Location = new System.Drawing.Point(133, 75);
this.txtUpdownMin.Name = "txtUpdownMin";
this.txtUpdownMin.Size = new System.Drawing.Size(92, 23);
this.txtUpdownMin.TabIndex = 14;
this.txtUpdownMin.Text = " ";
//
// txtMiddleMin
//
this.txtMiddleMin.Location = new System.Drawing.Point(133, 45);
this.txtMiddleMin.Name = "txtMiddleMin";
this.txtMiddleMin.Size = new System.Drawing.Size(92, 23);
this.txtMiddleMin.TabIndex = 13;
//
// label15
//
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(9, 112);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(116, 17);
this.label15.TabIndex = 11;
this.label15.Text = "(伺服三)进出伺服";
//
// label16
//
this.label16.AutoSize = true;
this.label16.Location = new System.Drawing.Point(9, 80);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(116, 17);
this.label16.TabIndex = 10;
this.label16.Text = "(伺服二)升降伺服";
//
// label17
//
this.label17.AutoSize = true;
this.label17.Location = new System.Drawing.Point(9, 50);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(116, 17);
this.label17.TabIndex = 9;
this.label17.Text = "(伺服一)旋转伺服";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.label10);
this.groupBox1.Controls.Add(this.txtIRSpeed);
this.groupBox1.Controls.Add(this.txtURSpeed);
this.groupBox1.Controls.Add(this.txtMRSpeed);
this.groupBox1.Controls.Add(this.label9);
this.groupBox1.Controls.Add(this.txtIDtime);
this.groupBox1.Controls.Add(this.txtUDtime);
this.groupBox1.Controls.Add(this.txtMDtime);
this.groupBox1.Controls.Add(this.txtIAtime);
this.groupBox1.Controls.Add(this.txtUAtime);
this.groupBox1.Controls.Add(this.txtMAtime);
this.groupBox1.Controls.Add(this.txtISpeed);
this.groupBox1.Controls.Add(this.txtUSpeed);
this.groupBox1.Controls.Add(this.txtMSpeed);
this.groupBox1.Controls.Add(this.label8);
this.groupBox1.Controls.Add(this.label7);
this.groupBox1.Controls.Add(this.label6);
this.groupBox1.Controls.Add(this.txtInOutSpeed);
this.groupBox1.Controls.Add(this.txtUpDownSpeed);
this.groupBox1.Controls.Add(this.txtMiddleSpeed);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox1.Location = new System.Drawing.Point(38, 75);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(758, 147);
this.groupBox1.TabIndex = 221;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "默认设置";
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(592, 21);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(56, 17);
this.label10.TabIndex = 32;
this.label10.Text = "速度倍率";
//
// txtIRSpeed
//
this.txtIRSpeed.Location = new System.Drawing.Point(580, 105);
this.txtIRSpeed.Name = "txtIRSpeed";
this.txtIRSpeed.Size = new System.Drawing.Size(92, 23);
this.txtIRSpeed.TabIndex = 35;
//
// txtURSpeed
//
this.txtURSpeed.Location = new System.Drawing.Point(580, 74);
this.txtURSpeed.Name = "txtURSpeed";
this.txtURSpeed.Size = new System.Drawing.Size(92, 23);
this.txtURSpeed.TabIndex = 34;
//
// txtMRSpeed
//
this.txtMRSpeed.Location = new System.Drawing.Point(580, 44);
this.txtMRSpeed.Name = "txtMRSpeed";
this.txtMRSpeed.Size = new System.Drawing.Size(92, 23);
this.txtMRSpeed.TabIndex = 33;
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(479, 21);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(56, 17);
this.label9.TabIndex = 20;
this.label9.Text = "减速时间";
//
// txtIDtime
//
this.txtIDtime.Location = new System.Drawing.Point(465, 106);
this.txtIDtime.Name = "txtIDtime";
this.txtIDtime.Size = new System.Drawing.Size(92, 23);
this.txtIDtime.TabIndex = 30;
//
// txtUDtime
//
this.txtUDtime.Location = new System.Drawing.Point(465, 75);
this.txtUDtime.Name = "txtUDtime";
this.txtUDtime.Size = new System.Drawing.Size(92, 23);
this.txtUDtime.TabIndex = 29;
//
// txtMDtime
//
this.txtMDtime.Location = new System.Drawing.Point(465, 45);
this.txtMDtime.Name = "txtMDtime";
this.txtMDtime.Size = new System.Drawing.Size(92, 23);
this.txtMDtime.TabIndex = 28;
//
// txtIAtime
//
this.txtIAtime.Location = new System.Drawing.Point(352, 106);
this.txtIAtime.Name = "txtIAtime";
this.txtIAtime.Size = new System.Drawing.Size(92, 23);
this.txtIAtime.TabIndex = 26;
//
// txtUAtime
//
this.txtUAtime.Location = new System.Drawing.Point(352, 75);
this.txtUAtime.Name = "txtUAtime";
this.txtUAtime.Size = new System.Drawing.Size(92, 23);
this.txtUAtime.TabIndex = 25;
//
// txtMAtime
//
this.txtMAtime.Location = new System.Drawing.Point(352, 45);
this.txtMAtime.Name = "txtMAtime";
this.txtMAtime.Size = new System.Drawing.Size(92, 23);
this.txtMAtime.TabIndex = 24;
//
// txtISpeed
//
this.txtISpeed.Location = new System.Drawing.Point(245, 106);
this.txtISpeed.Name = "txtISpeed";
this.txtISpeed.Size = new System.Drawing.Size(92, 23);
this.txtISpeed.TabIndex = 22;
//
// txtUSpeed
//
this.txtUSpeed.Location = new System.Drawing.Point(245, 75);
this.txtUSpeed.Name = "txtUSpeed";
this.txtUSpeed.Size = new System.Drawing.Size(92, 23);
this.txtUSpeed.TabIndex = 21;
//
// txtMSpeed
//
this.txtMSpeed.Location = new System.Drawing.Point(245, 45);
this.txtMSpeed.Name = "txtMSpeed";
this.txtMSpeed.Size = new System.Drawing.Size(92, 23);
this.txtMSpeed.TabIndex = 20;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(375, 21);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(56, 17);
this.label8.TabIndex = 19;
this.label8.Text = "加速时间";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(259, 21);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(56, 17);
this.label7.TabIndex = 18;
this.label7.Text = "目标速度";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(150, 21);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(56, 17);
this.label6.TabIndex = 17;
this.label6.Text = "开始速度";
//
// txtInOutSpeed
//
this.txtInOutSpeed.Location = new System.Drawing.Point(135, 106);
this.txtInOutSpeed.Name = "txtInOutSpeed";
this.txtInOutSpeed.Size = new System.Drawing.Size(92, 23);
this.txtInOutSpeed.TabIndex = 15;
//
// txtUpDownSpeed
//
this.txtUpDownSpeed.Location = new System.Drawing.Point(135, 75);
this.txtUpDownSpeed.Name = "txtUpDownSpeed";
this.txtUpDownSpeed.Size = new System.Drawing.Size(92, 23);
this.txtUpDownSpeed.TabIndex = 14;
this.txtUpDownSpeed.Text = " ";
//
// txtMiddleSpeed
//
this.txtMiddleSpeed.Location = new System.Drawing.Point(135, 45);
this.txtMiddleSpeed.Name = "txtMiddleSpeed";
this.txtMiddleSpeed.Size = new System.Drawing.Size(92, 23);
this.txtMiddleSpeed.TabIndex = 13;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(9, 111);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(116, 17);
this.label3.TabIndex = 11;
this.label3.Text = "(伺服三)进出伺服";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(9, 80);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(116, 17);
this.label2.TabIndex = 10;
this.label2.Text = "(伺服二)升降伺服";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(9, 50);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(116, 17);
this.label5.TabIndex = 9;
this.label5.Text = "(伺服一)旋转伺服";
//
// groupBox4
//
this.groupBox4.Controls.Add(this.label1);
this.groupBox4.Controls.Add(this.label67);
this.groupBox4.Controls.Add(this.txtInOutP3S);
this.groupBox4.Controls.Add(this.label61);
this.groupBox4.Controls.Add(this.txtInOutP2S);
this.groupBox4.Controls.Add(this.label62);
this.groupBox4.Controls.Add(this.txtInOutP1S);
this.groupBox4.Controls.Add(this.label63);
this.groupBox4.Controls.Add(this.txtMiddleP2S);
this.groupBox4.Controls.Add(this.label60);
this.groupBox4.Controls.Add(this.txtMiddleP1S);
this.groupBox4.Controls.Add(this.label58);
this.groupBox4.Controls.Add(this.txtUpdownP8S);
this.groupBox4.Controls.Add(this.label57);
this.groupBox4.Controls.Add(this.txtUpdownP7S);
this.groupBox4.Controls.Add(this.label56);
this.groupBox4.Controls.Add(this.txtUpdownP6S);
this.groupBox4.Controls.Add(this.label55);
this.groupBox4.Controls.Add(this.txtUpdownP5S);
this.groupBox4.Controls.Add(this.label54);
this.groupBox4.Controls.Add(this.txtUpdownP4S);
this.groupBox4.Controls.Add(this.label52);
this.groupBox4.Controls.Add(this.txtUpdownP3S);
this.groupBox4.Controls.Add(this.label51);
this.groupBox4.Controls.Add(this.txtUpdownP2S);
this.groupBox4.Controls.Add(this.label50);
this.groupBox4.Controls.Add(this.txtUpdownP1S);
this.groupBox4.Controls.Add(this.label53);
this.groupBox4.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox4.Location = new System.Drawing.Point(38, 227);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(542, 181);
this.groupBox4.TabIndex = 220;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "伺服P点速度列表";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Cursor = System.Windows.Forms.Cursors.Default;
this.label1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.ForeColor = System.Drawing.SystemColors.ControlText;
this.label1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label1.Location = new System.Drawing.Point(15, 70);
this.label1.Name = "label1";
this.label1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label1.Size = new System.Drawing.Size(59, 17);
this.label1.TabIndex = 258;
this.label1.Text = "升降伺服:";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label67
//
this.label67.AutoSize = true;
this.label67.Cursor = System.Windows.Forms.Cursors.Default;
this.label67.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label67.ForeColor = System.Drawing.SystemColors.ControlText;
this.label67.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label67.Location = new System.Drawing.Point(15, 30);
this.label67.Name = "label67";
this.label67.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label67.Size = new System.Drawing.Size(59, 17);
this.label67.TabIndex = 257;
this.label67.Text = "升降伺服:";
this.label67.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtInOutP3S
//
this.txtInOutP3S.AcceptsReturn = true;
this.txtInOutP3S.BackColor = System.Drawing.SystemColors.Window;
this.txtInOutP3S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtInOutP3S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtInOutP3S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtInOutP3S.Location = new System.Drawing.Point(342, 146);
this.txtInOutP3S.MaxLength = 0;
this.txtInOutP3S.Name = "txtInOutP3S";
this.txtInOutP3S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtInOutP3S.Size = new System.Drawing.Size(75, 23);
this.txtInOutP3S.TabIndex = 250;
//
// label61
//
this.label61.AutoSize = true;
this.label61.Cursor = System.Windows.Forms.Cursors.Default;
this.label61.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label61.ForeColor = System.Drawing.SystemColors.ControlText;
this.label61.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label61.Location = new System.Drawing.Point(306, 149);
this.label61.Name = "label61";
this.label61.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label61.Size = new System.Drawing.Size(34, 17);
this.label61.TabIndex = 249;
this.label61.Text = "P3:";
this.label61.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtInOutP2S
//
this.txtInOutP2S.AcceptsReturn = true;
this.txtInOutP2S.BackColor = System.Drawing.SystemColors.Window;
this.txtInOutP2S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtInOutP2S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtInOutP2S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtInOutP2S.Location = new System.Drawing.Point(225, 146);
this.txtInOutP2S.MaxLength = 0;
this.txtInOutP2S.Name = "txtInOutP2S";
this.txtInOutP2S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtInOutP2S.Size = new System.Drawing.Size(75, 23);
this.txtInOutP2S.TabIndex = 248;
//
// label62
//
this.label62.AutoSize = true;
this.label62.Cursor = System.Windows.Forms.Cursors.Default;
this.label62.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label62.ForeColor = System.Drawing.SystemColors.ControlText;
this.label62.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label62.Location = new System.Drawing.Point(189, 149);
this.label62.Name = "label62";
this.label62.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label62.Size = new System.Drawing.Size(34, 17);
this.label62.TabIndex = 247;
this.label62.Text = "P2:";
this.label62.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtInOutP1S
//
this.txtInOutP1S.AcceptsReturn = true;
this.txtInOutP1S.BackColor = System.Drawing.SystemColors.Window;
this.txtInOutP1S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtInOutP1S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtInOutP1S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtInOutP1S.Location = new System.Drawing.Point(103, 146);
this.txtInOutP1S.MaxLength = 0;
this.txtInOutP1S.Name = "txtInOutP1S";
this.txtInOutP1S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtInOutP1S.Size = new System.Drawing.Size(75, 23);
this.txtInOutP1S.TabIndex = 246;
//
// label63
//
this.label63.AutoSize = true;
this.label63.Cursor = System.Windows.Forms.Cursors.Default;
this.label63.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label63.ForeColor = System.Drawing.SystemColors.ControlText;
this.label63.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label63.Location = new System.Drawing.Point(15, 150);
this.label63.Name = "label63";
this.label63.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label63.Size = new System.Drawing.Size(94, 17);
this.label63.TabIndex = 245;
this.label63.Text = "进出伺服 P1:";
this.label63.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtMiddleP2S
//
this.txtMiddleP2S.AcceptsReturn = true;
this.txtMiddleP2S.BackColor = System.Drawing.SystemColors.Window;
this.txtMiddleP2S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtMiddleP2S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtMiddleP2S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtMiddleP2S.Location = new System.Drawing.Point(225, 106);
this.txtMiddleP2S.MaxLength = 0;
this.txtMiddleP2S.Name = "txtMiddleP2S";
this.txtMiddleP2S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtMiddleP2S.Size = new System.Drawing.Size(75, 23);
this.txtMiddleP2S.TabIndex = 242;
//
// label60
//
this.label60.AutoSize = true;
this.label60.Cursor = System.Windows.Forms.Cursors.Default;
this.label60.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label60.ForeColor = System.Drawing.SystemColors.ControlText;
this.label60.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label60.Location = new System.Drawing.Point(189, 109);
this.label60.Name = "label60";
this.label60.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label60.Size = new System.Drawing.Size(34, 17);
this.label60.TabIndex = 241;
this.label60.Text = "P2:";
this.label60.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtMiddleP1S
//
this.txtMiddleP1S.AcceptsReturn = true;
this.txtMiddleP1S.BackColor = System.Drawing.SystemColors.Window;
this.txtMiddleP1S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtMiddleP1S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtMiddleP1S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtMiddleP1S.Location = new System.Drawing.Point(103, 106);
this.txtMiddleP1S.MaxLength = 0;
this.txtMiddleP1S.Name = "txtMiddleP1S";
this.txtMiddleP1S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtMiddleP1S.Size = new System.Drawing.Size(75, 23);
this.txtMiddleP1S.TabIndex = 240;
//
// label58
//
this.label58.AutoSize = true;
this.label58.Cursor = System.Windows.Forms.Cursors.Default;
this.label58.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label58.ForeColor = System.Drawing.SystemColors.ControlText;
this.label58.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label58.Location = new System.Drawing.Point(15, 110);
this.label58.Name = "label58";
this.label58.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label58.Size = new System.Drawing.Size(94, 17);
this.label58.TabIndex = 239;
this.label58.Text = "旋转伺服 P1:";
this.label58.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP8S
//
this.txtUpdownP8S.AcceptsReturn = true;
this.txtUpdownP8S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP8S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP8S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP8S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP8S.Location = new System.Drawing.Point(457, 66);
this.txtUpdownP8S.MaxLength = 0;
this.txtUpdownP8S.Name = "txtUpdownP8S";
this.txtUpdownP8S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP8S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP8S.TabIndex = 238;
//
// label57
//
this.label57.AutoSize = true;
this.label57.Cursor = System.Windows.Forms.Cursors.Default;
this.label57.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label57.ForeColor = System.Drawing.SystemColors.ControlText;
this.label57.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label57.Location = new System.Drawing.Point(421, 69);
this.label57.Name = "label57";
this.label57.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label57.Size = new System.Drawing.Size(34, 17);
this.label57.TabIndex = 237;
this.label57.Text = "P8:";
this.label57.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP7S
//
this.txtUpdownP7S.AcceptsReturn = true;
this.txtUpdownP7S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP7S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP7S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP7S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP7S.Location = new System.Drawing.Point(341, 66);
this.txtUpdownP7S.MaxLength = 0;
this.txtUpdownP7S.Name = "txtUpdownP7S";
this.txtUpdownP7S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP7S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP7S.TabIndex = 236;
//
// label56
//
this.label56.AutoSize = true;
this.label56.Cursor = System.Windows.Forms.Cursors.Default;
this.label56.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label56.ForeColor = System.Drawing.SystemColors.ControlText;
this.label56.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label56.Location = new System.Drawing.Point(306, 69);
this.label56.Name = "label56";
this.label56.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label56.Size = new System.Drawing.Size(34, 17);
this.label56.TabIndex = 235;
this.label56.Text = "P7:";
this.label56.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP6S
//
this.txtUpdownP6S.AcceptsReturn = true;
this.txtUpdownP6S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP6S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP6S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP6S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP6S.Location = new System.Drawing.Point(225, 66);
this.txtUpdownP6S.MaxLength = 0;
this.txtUpdownP6S.Name = "txtUpdownP6S";
this.txtUpdownP6S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP6S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP6S.TabIndex = 234;
//
// label55
//
this.label55.AutoSize = true;
this.label55.Cursor = System.Windows.Forms.Cursors.Default;
this.label55.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label55.ForeColor = System.Drawing.SystemColors.ControlText;
this.label55.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label55.Location = new System.Drawing.Point(189, 69);
this.label55.Name = "label55";
this.label55.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label55.Size = new System.Drawing.Size(34, 17);
this.label55.TabIndex = 233;
this.label55.Text = "P6:";
this.label55.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP5S
//
this.txtUpdownP5S.AcceptsReturn = true;
this.txtUpdownP5S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP5S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP5S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP5S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP5S.Location = new System.Drawing.Point(103, 66);
this.txtUpdownP5S.MaxLength = 0;
this.txtUpdownP5S.Name = "txtUpdownP5S";
this.txtUpdownP5S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP5S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP5S.TabIndex = 232;
//
// label54
//
this.label54.AutoSize = true;
this.label54.Cursor = System.Windows.Forms.Cursors.Default;
this.label54.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label54.ForeColor = System.Drawing.SystemColors.ControlText;
this.label54.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label54.Location = new System.Drawing.Point(76, 70);
this.label54.Name = "label54";
this.label54.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label54.Size = new System.Drawing.Size(34, 17);
this.label54.TabIndex = 231;
this.label54.Text = "P5:";
this.label54.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP4S
//
this.txtUpdownP4S.AcceptsReturn = true;
this.txtUpdownP4S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP4S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP4S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP4S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP4S.Location = new System.Drawing.Point(458, 26);
this.txtUpdownP4S.MaxLength = 0;
this.txtUpdownP4S.Name = "txtUpdownP4S";
this.txtUpdownP4S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP4S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP4S.TabIndex = 230;
//
// label52
//
this.label52.AutoSize = true;
this.label52.Cursor = System.Windows.Forms.Cursors.Default;
this.label52.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label52.ForeColor = System.Drawing.SystemColors.ControlText;
this.label52.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label52.Location = new System.Drawing.Point(422, 29);
this.label52.Name = "label52";
this.label52.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label52.Size = new System.Drawing.Size(34, 17);
this.label52.TabIndex = 229;
this.label52.Text = "P4:";
this.label52.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP3S
//
this.txtUpdownP3S.AcceptsReturn = true;
this.txtUpdownP3S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP3S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP3S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP3S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP3S.Location = new System.Drawing.Point(341, 26);
this.txtUpdownP3S.MaxLength = 0;
this.txtUpdownP3S.Name = "txtUpdownP3S";
this.txtUpdownP3S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP3S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP3S.TabIndex = 228;
//
// label51
//
this.label51.AutoSize = true;
this.label51.Cursor = System.Windows.Forms.Cursors.Default;
this.label51.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label51.ForeColor = System.Drawing.SystemColors.ControlText;
this.label51.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label51.Location = new System.Drawing.Point(306, 29);
this.label51.Name = "label51";
this.label51.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label51.Size = new System.Drawing.Size(34, 17);
this.label51.TabIndex = 227;
this.label51.Text = "P3:";
this.label51.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP2S
//
this.txtUpdownP2S.AcceptsReturn = true;
this.txtUpdownP2S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP2S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP2S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP2S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP2S.Location = new System.Drawing.Point(225, 26);
this.txtUpdownP2S.MaxLength = 0;
this.txtUpdownP2S.Name = "txtUpdownP2S";
this.txtUpdownP2S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP2S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP2S.TabIndex = 226;
//
// label50
//
this.label50.AutoSize = true;
this.label50.Cursor = System.Windows.Forms.Cursors.Default;
this.label50.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label50.ForeColor = System.Drawing.SystemColors.ControlText;
this.label50.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label50.Location = new System.Drawing.Point(189, 29);
this.label50.Name = "label50";
this.label50.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label50.Size = new System.Drawing.Size(34, 17);
this.label50.TabIndex = 225;
this.label50.Text = "P2:";
this.label50.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtUpdownP1S
//
this.txtUpdownP1S.AcceptsReturn = true;
this.txtUpdownP1S.BackColor = System.Drawing.SystemColors.Window;
this.txtUpdownP1S.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtUpdownP1S.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.txtUpdownP1S.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtUpdownP1S.Location = new System.Drawing.Point(103, 26);
this.txtUpdownP1S.MaxLength = 0;
this.txtUpdownP1S.Name = "txtUpdownP1S";
this.txtUpdownP1S.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtUpdownP1S.Size = new System.Drawing.Size(75, 23);
this.txtUpdownP1S.TabIndex = 224;
//
// label53
//
this.label53.AutoSize = true;
this.label53.Cursor = System.Windows.Forms.Cursors.Default;
this.label53.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label53.ForeColor = System.Drawing.SystemColors.ControlText;
this.label53.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.label53.Location = new System.Drawing.Point(76, 29);
this.label53.Name = "label53";
this.label53.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.label53.Size = new System.Drawing.Size(34, 17);
this.label53.TabIndex = 223;
this.label53.Text = "P1:";
this.label53.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// btnSaveAxisSpeed
//
this.btnSaveAxisSpeed.Location = new System.Drawing.Point(680, 538);
this.btnSaveAxisSpeed.Name = "btnSaveAxisSpeed";
this.btnSaveAxisSpeed.Size = new System.Drawing.Size(98, 28);
this.btnSaveAxisSpeed.TabIndex = 99;
this.btnSaveAxisSpeed.Text = "保存配置";
this.btnSaveAxisSpeed.UseVisualStyleBackColor = true;
this.btnSaveAxisSpeed.Click += new System.EventHandler(this.btnSaveAxisSpeed_Click);
//
// FrmAxisMoveConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(840, 585);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.label18);
this.Controls.Add(this.label11);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.btnSaveAxisSpeed);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmAxisMoveConfig";
this.Text = "伺服运动参数配置";
this.Load += new System.EventHandler(this.FrmAxisMoveConfig_Load);
this.Shown += new System.EventHandler(this.FrmAxisMoveConfig_Shown);
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox groupBox4;
public System.Windows.Forms.Label label1;
private System.Windows.Forms.Button btnSaveAxisSpeed;
public System.Windows.Forms.Label label67;
public System.Windows.Forms.TextBox txtInOutP3S;
public System.Windows.Forms.Label label61;
public System.Windows.Forms.TextBox txtInOutP2S;
public System.Windows.Forms.Label label62;
public System.Windows.Forms.TextBox txtInOutP1S;
public System.Windows.Forms.Label label63;
public System.Windows.Forms.TextBox txtMiddleP2S;
public System.Windows.Forms.Label label60;
public System.Windows.Forms.TextBox txtMiddleP1S;
public System.Windows.Forms.Label label58;
public System.Windows.Forms.TextBox txtUpdownP8S;
public System.Windows.Forms.Label label57;
public System.Windows.Forms.TextBox txtUpdownP7S;
public System.Windows.Forms.Label label56;
public System.Windows.Forms.TextBox txtUpdownP6S;
public System.Windows.Forms.Label label55;
public System.Windows.Forms.TextBox txtUpdownP5S;
public System.Windows.Forms.Label label54;
public System.Windows.Forms.TextBox txtUpdownP4S;
public System.Windows.Forms.Label label52;
public System.Windows.Forms.TextBox txtUpdownP3S;
public System.Windows.Forms.Label label51;
public System.Windows.Forms.TextBox txtUpdownP2S;
public System.Windows.Forms.Label label50;
public System.Windows.Forms.TextBox txtUpdownP1S;
public System.Windows.Forms.Label label53;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox txtInOutSpeed;
private System.Windows.Forms.TextBox txtUpDownSpeed;
private System.Windows.Forms.TextBox txtMiddleSpeed;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox txtIDtime;
private System.Windows.Forms.TextBox txtUDtime;
private System.Windows.Forms.TextBox txtMDtime;
private System.Windows.Forms.TextBox txtIAtime;
private System.Windows.Forms.TextBox txtUAtime;
private System.Windows.Forms.TextBox txtMAtime;
private System.Windows.Forms.TextBox txtISpeed;
private System.Windows.Forms.TextBox txtUSpeed;
private System.Windows.Forms.TextBox txtMSpeed;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.TextBox txtInoutMax;
private System.Windows.Forms.TextBox txtUpdownMax;
private System.Windows.Forms.TextBox txtMiddleMax;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox txtInoutMin;
private System.Windows.Forms.TextBox txtUpdownMin;
private System.Windows.Forms.TextBox txtMiddleMin;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.Label label17;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.TextBox txtIRSpeed;
private System.Windows.Forms.TextBox txtURSpeed;
private System.Windows.Forms.TextBox txtMRSpeed;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label18;
private System.Windows.Forms.TextBox txtDelSpeed;
private System.Windows.Forms.Label label19;
private System.Windows.Forms.TextBox txtAddSpeed;
private System.Windows.Forms.Label label20;
private System.Windows.Forms.TextBox txtMaxSpeed;
private System.Windows.Forms.Label label21;
private System.Windows.Forms.TextBox txtTargetSpeed;
private System.Windows.Forms.Label lblShuoKeAdd;
private System.Windows.Forms.TextBox txtBeginSpeed;
private System.Windows.Forms.Label lblShuoKePort;
private System.Windows.Forms.GroupBox groupBox3;
}
}
\ No newline at end of file
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace OnlineStore.ACSingleStore
{
public partial class FrmAxisMoveConfig : FrmBase
{
private AC_SA_BoxBean boxBean = null;
public FrmAxisMoveConfig(AC_SA_BoxBean box )
{
this.boxBean = box;
InitializeComponent();
}
private void FrmAxisMoveConfig_Load(object sender, EventArgs e)
{
txtUpdownP1S.Text = boxBean.Config.UpDownAxis_P1_Speed.ToString();
txtUpdownP2S.Text = boxBean.Config.UpDownAxis_P2_Speed.ToString();
txtUpdownP3S.Text = boxBean.Config.UpDownAxis_P3_Speed.ToString();
txtUpdownP4S.Text = boxBean.Config.UpDownAxis_P4_Speed.ToString();
txtUpdownP5S.Text = boxBean.Config.UpDownAxis_P5_Speed.ToString();
txtUpdownP6S.Text = boxBean.Config.UpDownAxis_P6_Speed.ToString();
txtUpdownP7S.Text = boxBean.Config.UpDownAxis_P7_Speed.ToString();
txtUpdownP8S.Text = boxBean.Config.UpDownAxis_P8_Speed.ToString();
txtInOutP1S.Text = boxBean.Config.InOutAxis_P1_Speed.ToString();
txtInOutP2S.Text = boxBean.Config.InOutAxis_P2_Speed.ToString();
txtInOutP3S.Text = boxBean.Config.InOutAxis_P3_Speed.ToString();
txtMiddleP1S.Text = boxBean.Config.MiddleAxis_P1_Speed.ToString();
txtMiddleP2S.Text = boxBean.Config.MiddleAxis_P2_Speed.ToString();
//txtMiddleSpeed.Text = boxBean.Config.MiddleAxis_StartSpeed.ToString();
//txtInOutSpeed.Text = boxBean.Config.InoutAxis_StartSpeed.ToString();
//txtUpDownSpeed.Text = boxBean.Config.UpdownAxis_StartSpeed.ToString();
this.txtMSpeed.Text = boxBean.Config.MiddleAxis_TargetSpeed.ToString();
this.txtISpeed.Text = boxBean.Config.InoutAxis_TargetSpeed.ToString();
this.txtUSpeed.Text = boxBean.Config.UpdownAxis_TargetSpeed.ToString();
this.txtMAtime.Text = boxBean.Config.MiddleAxis_AddSpeed.ToString();
this.txtIAtime.Text = boxBean.Config.InoutAxis_DelSpeed.ToString();
this.txtUAtime.Text = boxBean.Config.UpdownAxis_AddSpeed.ToString();
this.txtMDtime.Text = boxBean.Config.MiddleAxis_DelSpeed.ToString();
this.txtIDtime.Text = boxBean.Config.InoutAxis_DelSpeed.ToString();
this.txtUDtime.Text = boxBean.Config.UpdownAxis_DelSpeed.ToString();
txtMiddleMax.Text = boxBean.Config.MiddleAxis_ErrorCountMax.ToString();
txtUpdownMax.Text = boxBean.Config.UpdownAxis_ErrorCountMax.ToString();
txtInoutMax.Text = boxBean.Config.InoutAxis_ErrorCountMax.ToString();
//txtComMax.Text = boxBean.Config.CompressAxis_ErrorCountMax.ToString();
txtMiddleMin.Text = boxBean.Config.MiddleAxis_ErrorCountMin.ToString();
txtUpdownMin.Text = boxBean.Config.UpdownAxis_ErrorCountMin.ToString();
txtInoutMin.Text = boxBean.Config.InoutAxis_ErrorCountMin.ToString();
//txtComMin.Text = boxBean.Config.CompressAxis_ErrorCountMin.ToString();
txtMRSpeed.Text = boxBean.Config.MiddleAxis_ResolveSpeed.ToString();
txtIRSpeed.Text = boxBean.Config.InoutAxis_ResolveSpeed.ToString();
txtURSpeed.Text = boxBean.Config.UpdownAxis_ResolveSpeed.ToString();
//txtCRSpeed.Text = boxBean.Config.CompressAxis_ResolveSpeed.ToString();
//txtAddSpeed.Text = boxBean.Config.CompressAxis_AddSpeed.ToString();
//txtDelSpeed.Text = boxBean.Config.CompressAxis_DelSpeed.ToString();
//txtMaxSpeed.Text = boxBean.Config.CompressAxis_MaxSpeed.ToString();
//txtBeginSpeed.Text = boxBean.Config.CompressAxis_StartSpeed.ToString();
//txtTargetSpeed.Text = boxBean.Config.CompressAxis_EndSpeed.ToString();
//this.txtCDtime.Text = boxBean.Config.CompressAxis_DecelTime.ToString();
//this.txtCSpeed.Text = boxBean.Config.CompressAxis_TargetSpeed.ToString();
//this.txtCAtime.Text = boxBean.Config.CompressAxis_AccelTime.ToString();
}
private void btnSaveAxisSpeed_Click(object sender, EventArgs e)
{
DialogResult resul = MessageBox.Show("配置使用地方过多,需要重启才能生效,是否确定保存?", "提示", MessageBoxButtons.YesNo);
if (!resul.Equals(DialogResult.Yes))
{
return;
}
boxBean.Config.UpDownAxis_P1_Speed = FormUtil.GetIntValue(txtUpdownP1S);
boxBean.Config.UpDownAxis_P2_Speed = FormUtil.GetIntValue(txtUpdownP2S);
boxBean.Config.UpDownAxis_P3_Speed = FormUtil.GetIntValue(txtUpdownP3S);
boxBean.Config.UpDownAxis_P4_Speed = FormUtil.GetIntValue(txtUpdownP4S);
boxBean.Config.UpDownAxis_P5_Speed = FormUtil.GetIntValue(txtUpdownP5S);
boxBean.Config.UpDownAxis_P6_Speed = FormUtil.GetIntValue(txtUpdownP6S);
boxBean.Config.UpDownAxis_P7_Speed = FormUtil.GetIntValue(txtUpdownP7S);
boxBean.Config.UpDownAxis_P8_Speed = FormUtil.GetIntValue(txtUpdownP8S);
boxBean.Config.InOutAxis_P1_Speed = FormUtil.GetIntValue(txtInOutP1S);
boxBean.Config.InOutAxis_P2_Speed = FormUtil.GetIntValue(txtInOutP2S);
boxBean.Config.InOutAxis_P3_Speed = FormUtil.GetIntValue(txtInOutP3S);
boxBean.Config.MiddleAxis_P1_Speed = FormUtil.GetIntValue(txtMiddleP1S);
boxBean.Config.MiddleAxis_P2_Speed = FormUtil.GetIntValue(txtMiddleP2S);
//boxBean.Config.CompressAxis_P1_Speed = FormUtil.GetIntValue(txtComPressP1S);
//boxBean.Config.CompressAxis_P2_Speed = FormUtil.GetIntValue(txtComPressP2S);
//boxBean.Config.CompressAxis_P3_Speed = FormUtil.GetIntValue(txtComPressP3S);
//boxBean.Config.MiddleAxis_StartSpeed = FormUtil.GetIntValue(txtMiddleSpeed);
//boxBean.Config.InoutAxis_StartSpeed = FormUtil.GetIntValue(txtInOutSpeed);
//boxBean.Config.UpdownAxis_StartSpeed = FormUtil.GetIntValue(txtUpDownSpeed);
//boxBean.Config.CompressAxis_StartSpeed = FormUtil.GetIntValue(txtComSpeed);
boxBean.Config.MiddleAxis_TargetSpeed = FormUtil.GetIntValue(txtMSpeed);
boxBean.Config.InoutAxis_TargetSpeed = FormUtil.GetIntValue(txtISpeed);
boxBean.Config.UpdownAxis_TargetSpeed = FormUtil.GetIntValue(txtUSpeed);
boxBean.Config.MiddleAxis_AddSpeed = FormUtil.GetShortValue(txtMAtime);
boxBean.Config.InoutAxis_AddSpeed = FormUtil.GetShortValue(txtIAtime);
boxBean.Config.UpdownAxis_AddSpeed = FormUtil.GetShortValue(txtUAtime);
boxBean.Config.MiddleAxis_DelSpeed = FormUtil.GetShortValue(txtMDtime);
boxBean.Config.InoutAxis_DelSpeed = FormUtil.GetShortValue(txtIDtime);
boxBean.Config.UpdownAxis_DelSpeed = FormUtil.GetShortValue(txtUDtime);
boxBean.Config.MiddleAxis_ErrorCountMax = FormUtil.GetShortValue(txtMiddleMax);
boxBean.Config.UpdownAxis_ErrorCountMax = FormUtil.GetShortValue(txtUpdownMax);
boxBean.Config.InoutAxis_ErrorCountMax = FormUtil.GetShortValue(txtInoutMax);
boxBean.Config.MiddleAxis_ErrorCountMin = FormUtil.GetShortValue(txtMiddleMin);
boxBean.Config.UpdownAxis_ErrorCountMin = FormUtil.GetShortValue(txtUpdownMin);
boxBean.Config.InoutAxis_ErrorCountMin = FormUtil.GetShortValue(txtInoutMin);
boxBean.Config.MiddleAxis_ResolveSpeed = FormUtil.GetShortValue(txtMRSpeed);
boxBean.Config.InoutAxis_ResolveSpeed = FormUtil.GetShortValue(txtIRSpeed);
boxBean.Config.UpdownAxis_ResolveSpeed = FormUtil.GetShortValue(txtURSpeed);
//boxBean.Config.CompressAxis_StartSpeed = FormUtil.GetIntValue(txtBeginSpeed);
//boxBean.Config.CompressAxis_AddSpeed = FormUtil.GetIntValue(txtAddSpeed);
//boxBean.Config.CompressAxis_DelSpeed = FormUtil.GetIntValue(txtDelSpeed);
//boxBean.Config.CompressAxis_EndSpeed = FormUtil.GetIntValue(txtTargetSpeed);
//boxBean.Config.CompressAxis_MaxSpeed = FormUtil.GetIntValue(txtMaxSpeed);
//boxBean.Config.CompressAxis_TargetSpeed = FormUtil.GetIntValue(txtCSpeed);
//boxBean.Config.CompressAxis_AccelTime = FormUtil.GetShortValue(txtCAtime);
//boxBean.Config.CompressAxis_DecelTime = FormUtil.GetShortValue(txtCDtime);
//更新缓存
ACStoreManager.UpdateBoxConfig(boxBean.Config);
}
private void FrmAxisMoveConfig_Shown(object sender, EventArgs e)
{
SetSkin(this);
}
}
}
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAA8AMDAQAAEABABoBgAA9gAAACgoEAABAAQAyAQAAF4HAAAgIBAAAQAEAOgCAAAmDAAAGBgQAAEA
BADoAQAADg8AABAQEAABAAQAKAEAAPYQAAAwMAAAAQAIAKgOAAAeEgAAKCgAAAEACACoCwAAxiAAACAg
AAABAAgAqAgAAG4sAAAYGAAAAQAIAMgGAAAWNQAAEBAAAAEACABoBQAA3jsAADAwAAABACAAqCUAAEZB
AAAoKAAAAQAgAGgaAADuZgAAICAAAAEAIACoEAAAVoEAABgYAAABACAAiAkAAP6RAAAQEAAAAQAgAGgE
AACGmwAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACA
gACAAAAAgACAAICAAACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAAwMDAAP///wAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA/lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAA
D///8AAAAAAAAAAAAAAAAAAAAAAAAAAE7////0AAAAAAAAAAAAAAAAAEZHZGBABP/////+AAQkJWZkAA
AAAAAAAG6+t3YAD///////8AB7brd2AAAAAAAAAHvtt0AA/////////kAEd77UAAAAAAAAAGt3ZgBO//
////////ACRnvlAAAAAAAAAHd0QAT///////////8EBHdmAAAAAAAAAEZ2QA////7uvb7v///kAkR0AA
AAAAAAAEdAAf///r69e+vb7///AAZ0AAAAAAAAAGUATv//vtvr2+t72+//9AB0AAAAAAAAAEAC///r6+
t76+vbe+7//gBCAAAAAAAAAABO//7t6+fX2+vre3vv//AAAAAAAAAAAAD///3r69t76+vb69vv//5AAA
AAAAAAAA///+vt5+3r7b69t723///wAAAAAAAAAP///3576+vre+vXvr23////AAAAAAAAD////73n19
7t6+vNvrdr7///8AAAAAAA7////t7r7ne+vtd9vr237////wAAAABP/////r7evt536+vr6+t7f////+
cAAAb//////r7r7evt7X1769vr3/////8AABD/////99fu5+7r7r7X6+t7f/////8AAAAP/////n7t7u
7Xfr6+vX233/////AAAAAA/////t7u7e7u3n7evr577////wAAAAAAD////+7u7u7t6+2+vr69////8A
AAAAAAAP///+3u7+7ufud33tt7////AAAAAAAAAA///+7u/u7e7evt6+vu///wAAAAAAAAAAD///7u7u
7u7N7r7evf//8AAAAAAAAAAEBP///u7u7ud9576+v//+QEAAAAAAAAAGcE7//u7u7t7r7efe7//wR0AA
AAAAAAAGe0D///7u7n5+fr6///8AfVAAAAAAAAALfXAP///u3n19vt7///BOt2AAAAAAAAAHd75A////
/u7u7v///kB3vrAAAAAAAAAE3rdwD///////////8ke+3kAAAAAAAAAE6+17ZP//////////AHvte3AA
AAAAAAAE6+vrcA/////////wRd63fVAAAAAAAAAG7XfXdgH///////8Aduvtd2AAAAAAAAAAVkdGVkAP
//////AGVkdGVgAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAA
AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///////8AAP///n///wAA///8P///AAD///gf//8AAP//8A///wAA///gB///AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAMAA
AAAAAwAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD//+AH//8AAP//8A///wAA///4H///
AAD///w///8AAP///n///wAA////////AAAoAAAAKAAAAFAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AADAwMAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF
cAAAAAAAAAAAAAAAAAAAAAAAAH/3AAAAAAAAAAAAAAAAAAAAAAAH//9wAAAAAAAAAAAAAAAAQAAAAH//
//cAAAAABAAAAAAABHt2VkAH/////3AFa3t2AAAAAAAAfXt2AH//////9wBGd9VAAAAAAAC3dkQH////
////cAR7dgAAAAAAAGezAH/////////3BGZ2AAAAAAAAdkQH///uvr3u//9wBWcAAAAAAABkAH//++2+
vVvu//cERgAAAAAAAAQH//7et9vr29vv/3AEAAAAAAAAAH//6+e+t7e+t77/9wAAAAAAAAAH//7r1313
fb69tu//cAAAAAAAAH///m53e+t7e3vr7//3AAAAAAAH///uvtftfX3r22u+//9wAAAAAH///+vte+vr
6+vr6+7///cAAAAH////3nfu3u3r3r69tv///nAAAH/////r7evr6+vre9e+////9wAAf////75+7u3u
fn3rfbf////3AAAH////7e7t7uvtvrvr6////3AAAAB////u3u7t7ud+3r2+///3AAAAAAf//+7u7u7u
ve2+d37//3AAAAAAAH///u7v7u7r7evbf//3AAAAAAAAB///7u/t7Xfuvn7v/3AAAAAAAABAf//u7u7u
frd9vv/3BAAAAAAAAHdH//7u7n5+3tfv/3C3QAAAAAAAvVB//+7u1+vr7v/3C3cAAAAAAAB9e0f//+7n
7e7//3B96wAAAAAAALfeYH/////////3C+vmAAAAAAAAfr63R////////3B9e+ZAAAAAAAC3fXdwf///
///3C3fetwAAAAAAAGdnt2QH/////3BHZ7dnAAAAAAAAAAAAAAB////3AAAAAAAAAAAAAAAAAAAAAAf/
/3AAAAAAAAAAAAAAAAAAAAAAAH/3AAAAAAAAAAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//+f//wAAAP//w///AAAA//+B//8A
AAD//wD//wAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgA
AAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAADwAAAADwAAAOAAAAAHAAAAwAAAAAMA
AACAAAAAAQAAAIAAAAABAAAAwAAAAAMAAADgAAAABwAAAPAAAAAPAAAA+AAAAB8AAAD4AAAAHwAAAPgA
AAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8A
AAD4AAAAHwAAAP//AP//AAAA//+B//8AAAD//8P//wAAAP//5///AAAA//////8AAAAoAAAAIAAAAEAA
AAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA
gAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AADAwMAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAG7gAAAAAAAAAAAAAAAAAADv/kAAAAAAAAAAAABARABO///gBARAAAAAAABH63tg
7////kZ3vrQAAAAAC+13Tv/////mt9dwAAAAAAfbdO///////gbr5AAAAABL5k7/7ut37v/iXXAAAAAA
DnDv/td729vv/kZ0AAAAAAZO/+vr6+vr6//lYAAAAAAA7/7r69t7e7v//gAAAAAATv/77efn13fbfv/k
AAAAAO//7ee+vbe9vr7//gAAAE7//+vt537uvr23///hAADv//933r7Xvbe3t////gAA7///5+7n7n7X
fXb///4AAA///+3u3u2+vr6+///mAAAA7//u7u7u7t69vv/+AAAAAA7//u/u7Xvr7c7/4AAAAAAA7/7u
7u7tfr3v/gAAAAAAB27/7+7ufuvu7+R0AAAAAEtw7/7u3r197/5GcAAAAAAO1U7//u7u7//gfrQAAAAA
S31w7//////+e11wAAAAAAfr607/////4WvtdAAAAABGd9dw7////kbm63AAAAAAAAQAAA7//+AABAAA
AAAAAAAAAAAA7/4AAAAAAAAAAAAAAAAAAA7nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA///////+f////D////gf//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AA
AAfAAAADgAAAAYAAAAHAAAAD4AAAB/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//4
H////D////5///////8oAAAAGAAAADAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gAAAgAAAAICAAIAAAACAAIAAgIAAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AADAwMAA////AAAA
AAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAf+cAAAAAAAAAQkYF7/9gBgYAAAAGvrdv///3vr5AAAAA
7mX/////R31AAAAAtl/+7r7v87cAAAAEd//b69vb/2dAAAAAT/7r6+vrf+cAAAAC/+vr7be3vv9wAAB/
/+3r5969vv/wAAf//33N6+t76///YAD//+3u5+3rt///cAB//+7u3te+3v/xAAAE//7u7u6+vv8gAAAA
f/7u7r197vYAAAAEZP/u7u6+/1ZAAAAA53/+7t7v925AAAAEt2H/////R74AAAAE7eZ////wft5AAAAA
BAQA//9wBAQAAAAAAAAAf/QAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAP//////5////8P//+AA
B//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//AAAP/gAAB/4AAAf/AAAP/4AAH/+AAB//gAAf/4AAH/+AA
B//gAAf/4AAH///D////5////////ygAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAMDA
wAD///8AAAAADnAAAAAAAADufgAAAAAFZH/+RkQAAG6+///k5AAARu/ut/d2AABO+9vr3+QAB+7u7b6+
9+Du/+2+vrf/537/7u7Xe/9+Dn/u7uvt/uAAR/7t6+/gAABn7u7u97YAAE5u///m5gAABlDv9wZQAAAA
AH7uAAAAAAAADnAAAAD+f////D///8AD///AA///wAP//8AD//+AAf//AAD//wAA//+AAf//wAP//8AD
///AA///wAP///w////+f///KAAAADAAAABgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAEAgEABAQEAAgICAANDQ0AEQkGABISEgAUFBQAGRkZAB0dHQAnFg4AKBYOAC4aEQA9IhYAJSUlACws
LAAxMTEAODg4AD4+PgBFJxkAUy8fAFozIQBlOSUAcD8qAHJAKgB2QywAeUQtAEBAQABFRUUASEhIAFNT
UwBXV1cAXV1dAGFhYQBlZWUAampqAG5ubgBycnIAeHh4AH5+fgCHTDIAiEwyAMlTLgDLVTAAzVkzAMxZ
NADMXDoA0Fw2ANNgOADUYjoA1WQ8ANhnPgDYaD8AsWRCANVnQgDaaUAA3GxDANhrRADdbUQA3nBGANF2
TgDXclAA3ntXAOBxRgDhc0kA4XRKAON2TADkd00A5HhNAOh8TwDme1AA5nxSAOh9UQDpf1QA5IFVAOuA
UwDoglYA7IJVAOmCWADthlkA7IdcAO2IXQDwh1kA8ohZAPGKXADyjF8A9IxeAN2LbwDdi3AA3ZJ6AO6L
YADvjGIA8Y1hAPSOYQDxj2QA9JBiAPGRZgD0kmYA8pNoAPOWawD0lWoA9JZsAPSYbgDml3kA9ZpxAPWd
dQD2n3gA9aB5APaifQD2poEA9qeEAPeohAD3q4gA962LAPCqjgD3ro0A97CPAPexkAD3tZYA+LCQAPiz
lAD4tJYA+LaZAPi5nQDotKMA6LWmAPi7oAD4vaIA+b6kAPG/rAD5wKYA+cKqAPnFrQDsxbkA+cawAPnJ
tAD5zLcA+s25APrPvAD60L0A2traANzc2wDc3NwA+tTDAPrWxgD72McA+tfIAPvZyQD7280A+93PAPzd
zwD73dAA/OTZAP3p4AD46+cA++/pAPzw6wD98uwA/fbyAP39/QAAAAAALwMAAFAEAABwBgAAkAkAALAK
AADPDAAA8A4AAP8gEgD/PjEA/1xRAP96cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAA
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
AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvgA
AAAAHwAO8AAAAAAPAA7gAAAAAAcADsAAAAAAAwAOgAAAAAABAA6AAAAAAAEADsAAAAAAAwAO4AAAAAAH
AA7wAAAAAA8ADvgAAAAAHwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwA
AAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/
AA7//+AH//8ADv//8A///wAO///4H///AA7///w///8ADv///n///wAO////////AA4oAAAAKAAAAFAA
AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAMBwQACgoKAA4ODgAcDwoAHBAKABAQ
EAAeHh4ALRkQACkpKQAuLi4AMDAwADY2NgA6OjoAPT09AEUnGQBjNyQAYzgkAGQ4JABtPSgAcT8pAHJA
KgBCQkIARkZGAElJSQBOTk4AV1dXAFlZWQBdXV0AYWFhAGVlZQBoaGgAbGxsAHl5eQB+fn4AiU0zAJBR
NQCYVjgAp14+AKlfPgCqYD8AyVMuAMlULwDMVzEAz1s1ANJfOADTYDkA1WQ8ANloPwCuYkAAsmRCALVm
QwC2ZkQAxW9JANVnQQDZaUAA3GxCANhrRADdbkQA0GlJAN9wRQDXc1IA335aAOBxRwDgckkA4nRJAON3
TADjeE4A5XlNAOF/UwDnfVIA4X9UAOd+VADpflEA6YFWAOyCVQDphFcA6oNYAOmEWQDthlgA7YleAPKI
WgD0ilsA8IpdAPKMXgDeknkA6YpjAO2LYADyjmEA9I5hAPCPZAD0kGMA8pFmAPSSZQDxkmgA9JNoAPOU
aQD0lWoA9JZsAPSYbgD0mnEA9ZxzAPWddQD2n3gA9aF7APWifAD2pH4A6Z+EAOCdiQD2pYEA9qmGAPar
iAD3ro0A97GRAPe0lgD4tpgA97ibAPi5ngD3u6EA97yiAPi7oAD4vaIA+b6kAPnApwD4w6sA+cStAO3G
uQD5xrAA+ciyAPnJtAD5zbgA+tC+APTOwAD608EA+dXFAPvZyQD72swA+9zNAPzi1gD86N8A/Pn3APr6
+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
AAAsAC8ASwBQAGkAcACHAJAApQCwAMQAzwDhAPAA8BH/APIx/wD0Uf8A9nH/APeR/wD5sf8A+9H/AP//
/wAAAAAAGwAvAC0AUAA/AHAAUgCQAGMAsAB2AM8AiADwAJkR/wCmMf8AtFH/AMJx/wDPkf8A3LH/AOvR
/wD///8AAAAAAAgALwAOAFAAFQBwABsAkAAhALAAJgDPACwA8AA+Ef8AWDH/AHFR/wCMcf8AppH/AL+x
/wDa0f8A////AAAAAAAAAAAXFwAAAAAAAAAAAAAAAAAXFxcXAAAAAAAAAAACAwMBFyQkFwEDAwIAAAAA
AxAFFyQkJCQXBRADAAAAAAMFFyIYCwgRIRcFAwAAAAABFyITDQwJBwYhFwEAAAAXFyQbExIPDAoHESQX
FwAXFyQkFRYWFA8MCggkJBcXFxckJBodHBkUDgwLJCQXFwAXFyQeIB8dFhINGCQXFwAAAAEXIyAgHRYT
EyIXAQAAAAADBBcjHhoVGyIXBQMAAAAAAxAEFyQkJCQXBRADAAAAAAIDAwEXJCQXAQMDAgAAAAAAAAAA
FxcXFwAAAAAAAAAAAAAAAAAXFwAAAAAAAAD+fwAA/D8AAMADAADAAwAAwAMAAMADAACAAQAAAAAAAAAA
AACAAQAAwAMAAMADAADAAwAAwAMAAPw/AAD+fwAAKAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAABAAAAAlAAAARgAAAHEAAACaAAAAvgAAAL4AAACaAAAAcAAA
AEYAAAAlAAAAEAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABAAA
AAUAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAALAAAAFQAAACoAAABKAAAAdAAAAKIAAADNAAAA+gAA
APoAAADNAAAAogAAAHQAAABKAAAAKQAAABUAAAAKAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA
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
Qf+HTDL/WzMh/y4aEf8DAgH/HR0d/9ra2f/9/f3//v79//39/f/+/v3//v79//7+/f/9/f3//f39//7+
/f/+/v3//f39//7+/v/+/v3//f39//39/f/9/f3/2NjY/xwcG/8EAgH/LhoR/1szIf+ITDL/sWRB/9F2
Tv9wPyn/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAHAAA
AP9lOSX/sGRB/4ZLMf9aMiH/LhoR/wMCAf8fHx//2tra//7+/f/+/v7//v79//7+/f/77ej/8L+r/+aW
ef/ee1f/2GtE/9VnQf/XcU//3Ipv/+i0o//46eX//f39//7+/f/9/f3//v7+/9jY2P8dHR3/AwIB/y4Z
EP9aMiH/hkwx/7FkQf9lOSX/AAAA/wAAAL8AAACAAAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAALAAAAJgAAAP9TLx7/h0wx/1oyIf8uGhD/BAIB/x8fH//Z2dn//v7+//7+/v/+/v7//O/q/++q
jv/keE7/4HFG/91tQ//aakD/2GY+/9VjO//SXzj/0Fw1/81ZMv/MWjX/3ZF6//jq5v/+/v3//v7+//7+
/v/Y2Nf/HR0d/wMCAf8uGRD/WjIh/4dMMv9TLx//AAAA/wAAAMEAAACCAAAAQgAAABgAAAAGAAAAAAAA
AAAAAAAAAAAAAQAAAAUAAAAVAAAAOAAAAP89Ihb/WjMh/y4aEf8EAgH/HR0d/9ra2v/+/v7//v79//7+
/f/51sb/7Ihd/+h8T//leUz/4nVJ/+BxR//dbkT/2mtB/9hnP//VYzz/0l85/9BcNf/NWTL/ylUw/8xd
O//sxLj//v7+//7+/v/+/v7/2NjY/xwcG/8DAgH/LhkQ/1ozIf89Ihb/AAAA/wAAAMYAAACHAAAARQAA
ABkAAAAGAAAAAAAAAAAAAAABAAAABQAAABAAAAAqAAAAVwAAAP8nFg7/LhoR/wMCAf8fHx//2tra//7+
/v/+/v7//v79//rNuf/wh1n/7YNV/+qAU//ofVD/5XlO/+N2S//hckj/3m9F/9trQv/YZz//1WQ8/9Jf
Of/QXDb/zVkz/8pVL//JUy//57Sk//7+/v/+/v7//v7+/9jY2P8eHh3/AwIB/y4aEf8nFg7/AAAA/wAA
AM8AAACRAAAATAAAABwAAAAGAAAAAAAAAAEAAAAFAAAADwAAACUAAABJAAAAfgAAAP8QCQX/BAIB/x8f
H//Z2dn//f39//39/f/+/v3/+9jI//SMXf/yilv/74dZ/+2FV//rglX/6H5S/+Z7T//jd0z/4XNJ/95w
Rv/ba0P/2Gc//9VkPP/TYDn/0Fw2/81ZM//KVTD/yVMv/+zEuP/+/v3//v79//39/f/X19f/Hh4d/wQC
Af8QCQX/AAAA/wAAANoAAAChAAAAXAAAACYAAAAKAAAAAQAAAAUAAAAPAAAAJAAAAEYAAAB0AAAAqAAA
AP8AAAD/HR0d/9ra2v/+/v7//v79//7+/f/98ev/9JNo//OMXv/zjV7/8o1f//GKXf/uhlr/64NX/+l/
VP/me1D/5HhN/+FzSv/ecEb/22xD/9hnP//WZDz/02A5/9BcNv/NWTP/ylUw/8xdO//46ub//v7+//39
/f/+/v3/2NjY/xwcHP8AAAD/AAAA/wAAAOYAAAC3AAAAdAAAADgAAAAVAAAABQAAAA8AAAAkAAAARgAA
AHIAAACiAAAA0gAAAP8fHx//2trZ//39/f/9/f3//f39//7+/f/4t5n/841f//SOYP/0j2L/9I9i//OP
Yv/xjF//7ohc/+yEWf/pgFX/5nxS/+R4Tv/hdEr/3nBG/9tsQ//ZaED/1mQ8/9NgOf/QXDb/zVkz/8tV
MP/dkXr//v39//39/f/9/f3//v79/9jY2P8eHh7/AAAA/wAAAPEAAADPAAAAlQAAAFYAAAApAAAADwAA
ACAAAABCAAAAbwAAAKAAAADPAAAA+x8fH//Z2dn//v79//7+/f/+/v3//v79//3x6//0kWT/849h//SR
ZP/0kmX/9JJm//STZv/zkWX/8Y1i/+6JXv/shlr/6YFW/+Z9Uv/jeU7/4XRK/95wR//bbEP/2WhA/9Zk
PP/TYDn/0Fw2/81ZMv/MWTX/+Orl//39/f/+/v3//v79//39/f/X19f/Hh4e/wAAAP4AAADlAAAAtwAA
AHwAAABGAAAAIAAAADQAAABjAAAAmAAAAMwAAAD6HR0d/9ra2v/+/v7//v79//7+/v/+/v7//v7+//rN
uP/0kGL/9JJl//SUaP/0lWr/9JVr//SWa//0lWr/85No//GPZP/ui2D/64dc/+mCV//mfVP/43lO/+B0
Sv/ecEf/22xD/9loQP/WZDz/0mA5/9BcNf/NWTL/6LSj//7+/v/+/v7//v7+//7+/v/+/v7/2NjY/xwc
HP8AAAD8AAAA2AAAAKAAAABmAAAANQAAAEMAAAB5AAAAugAAAPofHx/+2tra//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//ixkf/0k2f/9JZr//WYb//1mnH/9Zpx//Wacf/1mXD/9Jhv//SWbP/xkWf/74xi/+yH
Xf/pglj/5n1T/+N5T//hdEr/3nBH/9xsQ//ZaD//1WQ8/9JfOf/QXDX/3Ypv//7+/f/+/v7//v7+//7+
/v/+/v7//f39/9jY2P8dHR3/AAAA+wAAAL8AAAB7AAAAQwAAAEEAAACNAAAA9h8fH//Z2dn//v7+//39
/f/9/f3//v7+//7+/f/+/v7//v7+//ahe//0lmz/9Ztx//Wedv/1n3j/9aB5//Wgef/1n3j/9Z11//Wb
cv/0mG7/8pJp/++NY//siF3/6YJY/+Z9U//jeU7/4XRK/95wRv/bbEP/2Gc//9VjPP/SXzj/13JQ//7+
/f/+/v7//v7+//7+/v/+/v7//f39//39/f/X19f/HR0d/wAAAPYAAACOAAAAQQAAAFQAAADvHR0d/9ra
2v/9/f3//v7+//39/f/9/f3//f39//39/f/+/v3//f39//Wbcv/1m3L/9aB5//akf//2poL/9qeD//an
g//2pYH/9aN9//Wgef/1nXX/9Jlw//KTaf/vjWL/64dc/+iBV//mfVL/43hO/+FzSf/eb0b/22tC/9dn
Pv/VYzv/1WdB//39/f/+/v3//v79//39/f/9/f3//f39//39/f/9/f3/2NjY/xwcHP8AAADvAAAAVAAA
AEMAAADrHh4e/tvb2//+/v7//v7+//7+/v/+/v3//v7+//7+/v/+/v7//v79//aed//1oHn/9qeD//es
iv/3r47/97CQ//ewkP/3roz/9qqI//angv/2onz/9Z52//SZcP/ykmj/7oxh/+uHXP/pgVb/5nxS/+R4
Tf/hc0n/3m9G/9prQf/YZj7/2GtE//7+/f/+/v3//v79//7+/v/+/v7//f39//7+/v/9/f3/2tra/x0d
Hf4AAADqAAAAQQAAAAwAAABGAAAA6yAgIP7a2tr//v7+//39/f/9/f3//v79//7+/f/+/v7//f39//eq
iP/2pYH/966N//i1l//4uJz/+Lqe//i6nf/4t5n/97KT//etjP/2p4T/9aJ8//Wddf/0l27/8ZFm/+6L
YP/rhVr/6YBV/+Z7UP/kd0z/4XJI/91uRP/aakD/3ntX//39/f/+/v3//v79//7+/f/+/v3//f39//39
/f/Z2dn/Hx8f/gAAAOsAAABIAAAADAAAAAMAAAAMAAAARQAAAO0gICD+29vb//39/f/9/f3//v79//7+
/f/+/v3//v79//i9ov/2qoj/97WX//i+o//4wqr/+cSt//nEq//4wKf/+Luf//e0lv/3rYz/9qaC//Wg
ef/1m3L/85Vr//CPZP/uiV7/64RY/+l/U//me0//43ZL/99xRv/dbUP/5pZ5//7+/f/+/v3//v79//7+
/f/+/v3//f39/9nZ2f8fHx//AAAA7wAAAFQAAAASAAAABAAAAAAAAAADAAAADAAAAEUAAADrHh4e/tvb
2//+/v7//v7+//7+/v/+/v7//v79//vXx//3r47/+Lyg//nGr//5zLj/+s+7//nNuf/5ybP/+MOr//i7
oP/3s5T/9qqI//ajfv/1nXX/9Jhu//OTaP/wjWL/7ohc/+uDV//pflL/5XlO/+J1Sf/gcUb/8b+r//7+
/f/+/v3//v79//7+/v/+/v7/2tra/x0dHf8AAADzAAAAcQAAACMAAAAJAAAAAQAAAAAAAAAAAAAAAwAA
AA0AAABJAAAA7CAgIP/a2tr//v79//7+/f/+/v3//v79//308P/4tJb/+MCm//nMuP/61MP/+tfH//rW
xf/60b7/+cm0//jAp//4t5r/966N//amgf/1n3j/9Zlw//SVav/zkWX/8Yxf/+6HWv/rglX/6H1Q/+V4
TP/keE7/++3o//39/f/+/v3//v7+//7+/f/Z2dn/Hx8f/wAAAPgAAACeAAAASgAAABsAAAAGAAAAAAAA
AAAAAAAAAAAAAAAAAAQAAAASAAAAVQAAAP8gICD/29vb//7+/f/+/v3//f39//7+/f/60L3/+MCn//rO
u//62Mn/+9zP//vbzf/61sX/+c25//nErP/4up7/97CQ//eng//2oHn/9Zpx//WWa//0k2b/9I9i//GK
Xf/uhVj/64BT/+h8T//vqo3//v79//39/f/9/f3//v7+/9ra2v8fHx//AAAA/wAAAMwAAACFAAAARAAA
ABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAJAAAAIwAAAP8AAAD/Hh4e/9vb2//+/v7//v79//7+
/v/99vL/+cOq//nLt//618f/+93P//vcz//618f/+s+7//nFrf/4up7/97CQ//enhP/1oHn/9Zpx//SV
a//0kmb/9JBj//ONX//wiFr/7YNV/+yIXf/87+r//v7+//7+/f/+/v3/2tra/x0dHf8AAAD/AAAA/wAA
AMEAAACBAAAAQgAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGwAAAP9EJhn/EgoG/yAg
IP/a2tr//v7+//7+/v/+/v7//Ong//nFrv/50L3/+tfH//vYyf/61MP/+cy4//nDq//4uZz/96+P//an
g//1oHn/9Zpw//SVav/0kmX/9I9i//ONX//yi1z/8IdZ//nWxv/+/v7//v7+//7+/f/Z2dn/Hx8f/xMK
B/9FJxn/AAAA/wAAAL4AAACAAAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAA
AP9yQCr/sWRB/xEJBv8gICD/29vb//7+/f/+/v7//v7+//zj2P/4xa7/+cu3//nOu//5zLj/+cav//i+
pP/3tZf/9qyK//akf//1nnb/9Zhu//SUaP/0kWP/9I5g//OMXf/zjF7/+s25//7+/f/+/v7//v79/9ra
2f8fHx//EQoG/7JlQv9yQCr/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAGAAAAGAAAAP93Qyz/6INW/7FkQf8SCgb/Hh4e/9vb2//+/v7//v7+//7+/v/86eD/+cKq//jA
p//4v6b/+Lug//e1mP/3ro3/9qeD//Wgev/1mnH/9JVq//SSZf/0j2H/841f//WUaP/72Mj//v7+//7+
/v/+/v7/2tra/x0dHf8TCwf/smVC/+iCVv93Qyz/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP95RC3/8IdZ/+eCVv+wY0H/EgoG/yAgIP/a2tr//v7+//7+
/f/+/v7//fby//rQvf/3tJX/9q6O//aqiP/2pYH/9aB5//Wbcv/0lmz/9JJm//SPYv/0kWT/+LeZ//3x
6//+/v3//v7+//7+/v/Z2dn/IB8f/xMLB/+yZEL/54JW//CHWf95RC3/AAAA/wAAAL4AAAB/AAAAQQAA
ABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP96RS3/84la//CHWf/nglb/sWRB/xEK
Bv8gICD/29vb//7+/f/+/v7//v7+//7+/f/99PD/+9fH//m+o//3q4j/9p53//Wbcv/2oXv/+LGR//rN
uP/98ev//v79//7+/f/9/f3//v7+/9ra2v8gIB//EgoG/7JlQv/nglb/8IdZ//OJWv95RC3/AAAA/wAA
AL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP96RS3/84la//OJ
Wv/wh1n/6INW/7FkQf8SCgb/Hh4e/9vb2//+/v7//v79//39/f/+/v3//v79//7+/f/9/f3//v79//39
/f/+/v7//v7+//7+/v/+/v3//f39//7+/f/9/f3/2tra/x0dHf8TCgf/smVC/+iCVv/wh1n/84la//OJ
Wv95RC3/AAAA/wAAAL0AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAA
AP96RS3/84la//OJWv/ziVr/8IdZ/+eCVv+wY0H/EgoG/yAgIP/a2tr//v7+//39/f/+/v3//v7+//7+
/f/+/v7//v7+//7+/f/+/v7//v7+//7+/v/+/v3//f39//7+/v/Z2dn/Hx8f/xMKB/+yZEL/54JW//CH
Wf/ziVr/84la//OJWv95RC3/AAAA/wAAALkAAAB9AAAAQAAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAFAAAAFgAAAP96RS3/84la//OJWv/ziVr/84la//CHWf/nglb/sWRB/xEJBv8gICD/29vb//7+
/f/+/v3//v7+//7+/f/+/v3//v7+//39/f/+/v3//v79//7+/v/+/v7//f39/9ra2v8gHx//EQoG/7Jl
Qv/nglb/8IdZ//OJWv/ziVr/84la//OJWv95RC3/AAAA/wAAAKwAAABzAAAAOwAAABYAAAAFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAEAAAAEgAAAP96RS3/84la//OJWv/ziVr/84la//OJWv/wh1n/6INW/7Fk
Qf8SCgb/Hh4e/9vb2//+/v3//v79//7+/f/+/v3//v79//39/f/+/v7//v79//7+/v/+/v3/2trZ/x0d
Hf8TCwf/smVC/+iCVv/wh1n/84la//OJWv/ziVr/84la//OJWv95RC3/AAAA/wAAAI0AAABfAAAAMQAA
ABIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADAAAAP89Ihb/ekUt/3pFLf96RS3/ekUt/3pF
Lf95RC3/d0Ms/3JAKv9EJhn/AAAA/yAgIP/a2tr//v7+//39/f/9/f3//v79//39/f/+/v3//v7+//7+
/v/Z2dn/Hx8f/wAAAP9FJxn/ckAq/3dDLP95RC3/eUQt/3lELf95RC3/eUQt/3lELf88Ihb/AAAA/wAA
AF8AAABAAAAAIQAAAAwAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gICD/29vb//39/f/9/f3//v7+//39
/f/9/f3//v7+/9ra2v8fHx//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAADEAAAAhAAAAEQAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
AAYAAAAMAAAAEgAAABYAAAAXAAAAGAAAABgAAAAYAAAAGAAAABgAAAAbAAAAIwAAAFUAAADsHh4e/tvb
2//+/v7//v7+//7+/v/+/v7/2tra/h0dHf8AAADrAAAAVAAAACMAAAAbAAAAGAAAABgAAAAYAAAAGAAA
ABgAAAAYAAAAGAAAABgAAAAXAAAAFgAAABIAAAAMAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAEAAAADAAAABAAAAAUAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACQAA
ABIAAABJAAAA6yAgIP7a2tr//v7+//39/f/Z2dn/Hx8f/gAAAOoAAABIAAAAEgAAAAkAAAAGAAAABgAA
AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAFAAAABQAAAAQAAAADAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAQAAAAQAAAANAAAARQAAAO0gICD+29vb/tra2v4fHx/+AAAA7AAAAEQAAAANAAAABAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADAAAAEIAAADqHh4e/h0dHf4AAADpAAAAQQAA
AAwAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAA9AAAA6QAA
AOgAAAA7AAAACQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAIAAAAFAAAANAAAADMAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAO/AAAAAAH
AA74AAAAAAMADvAAAAAAAQAO8AAAAAABAA7wAAAAAAEADvAAAAAAAQAO8AAAAAABAA7wAAAAAAEADvAA
AAAAAQAO8AAAAAABAA7wAAAAAAEADvAAAAAAAQAO4AAAAAABAA7AAAAAAAEADoAAAAAAAQAOAAAAAAAA
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
/f/9/f3//f39//39/f/9/f3//f39//7+/f/9/f3//f39//r6+v9lZWX/AgEB/y4aEP9kOCX/mVY4/8Vv
Sf+nXj7/AAAA/wAAALgAAABsAAAAKgAAAAoAAAABAAAAAAAAAAAAAAAAAAAABAAAABoAAAD/kFE1/5hW
OP9jNyT/LRkQ/wIBAf9oaGj/+/v7//7+/v/+/v3//fr4//TOwP/pn4T/335a/9hrRP/VZ0H/13NS/96S
ef/txbj//Pn3//7+/f/9/f3/+/v7/2VlZf8CAQH/LRkQ/2M3JP+YVjj/kFE1/wAAAP8AAAC5AAAAbAAA
ACoAAAAKAAAAAQAAAAAAAAAAAAAAAQAAAAkAAAAnAAAA/209KP9jOCT/LRkQ/wIBAf9oaGj/+/v7//7+
/f/+/v7/+NXG/+qKY//idUn/33BF/9xsQv/ZaD//1mQ8/9JfOP/PWzX/zFcx/9BpSf/tx7v//v79//7+
/v/7+/v/ZWVl/wIBAP8tGRD/Yzgk/209KP8AAAD/AAAAvQAAAG4AAAAqAAAACgAAAAEAAAAAAAAAAQAA
AAUAAAAXAAAAQgAAAP9FJxn/LRkQ/wIBAf9nZ2f//Pz8//7+/v/9/Pz/97uh/+yCVP/pfVD/5XpN/+J1
Sv/gcUf/3W1E/9lpQP/VZDz/0l85/89bNf/MVzH/yVMv/+Cdif/9/Pz//v7+//v7+/9lZWX/AgEB/y0Z
EP9FJxn/AAAA/wAAAMQAAAB2AAAALgAAAAoAAAABAAAAAAAAAAUAAAATAAAAMwAAAGwAAAD/HBAK/wIB
Af9oaGj/+/v7//7+/f/+/v3/+b6k//KKW//vhlj/7INW/+l/U//me0//43dM/+BySP/dbkX/2WlA/9Zl
PP/TYDn/z1s1/8xXMf/JUy7/4J2J//7+/f/+/v3/+/v6/2ZmZf8CAQH/HBAK/wAAAP8AAADRAAAAhwAA
ADkAAAAOAAAAAQAAAAUAAAATAAAAMAAAAGEAAACeAAAA/wAAAP9nZ2f/+/v7//7+/f/+/v3/+9rK//OM
Xv/zjF7/8oxe//CJXP/thVj/6YBV/+d8Uf/keE3/4HNJ/91uRf/aaUH/1mU9/9NgOf/PWzb/zFcx/8lU
L//tx7v//v79//39/f/7+/v/ZWVl/wAAAP8AAAD/AAAA4AAAAKEAAABSAAAAHAAAAAUAAAASAAAAMAAA
AGAAAACZAAAA0gAAAP9oaGj/+/v7//39/f/9/f3//fv5//Wcc//zjmD/9I9h//SPY//zj2L/8Itf/+2H
W//qglf/531S/+R4Tv/gc0r/3W9F/9pqQf/WZT3/02A5/89bNv/MVzH/0GlJ//z59//9/f3//v79//v7
+/9lZWX/AAAA/wAAAPAAAADCAAAAeQAAADgAAAATAAAAKgAAAFoAAACVAAAAzwAAAPxoaGj/+/v7//7+
/v/+/v7//v79//vYyP/0j2H/9JFk//SSZv/0k2f/9JNo//OSZv/wjWL/7Yhd/+qDWP/nflP/43hO/+Bz
Sv/dbkX/2mpB/9ZlPf/TYDn/z1s1/8xXMf/txbj//f39//7+/v/+/v3/+/v6/2VlZf8AAAD+AAAA4QAA
AKUAAABgAAAAKgAAAEIAAACBAAAAxwAAAPxnZ2f/+/v7//7+/v/+/v7//v7+//7+/v/4tpj/9JJl//SV
av/0l23/9Jhu//WYbv/0l23/85Rq//CPZf/til//6oRZ/+d+VP/jeU7/4HNK/91vRf/aaUH/1mU9/9Jf
Of/PWzX/35J5//7+/f/+/v7//v7+//7+/v/7+/v/ZWVl/wAAAP0AAADOAAAAhQAAAEIAAABIAAAAoAAA
APpoaGj/+/v7//7+/v/+/v3//v7+//7+/v/+/v7/9qJ8//SWbP/1m3L/9Z11//Wed//1nnf/9Z11//Wb
cv/0l27/8ZFn/+6LYP/qhFr/535U/+N5T//gc0r/3W5F/9ppQf/WZDz/0l84/9dzUv/9/f3//v7+//7+
/v/+/v7//f39//v7+/9lZWX/AAAA+wAAAKMAAABIAAAAYQAAAPRnZ2f/+/v7//7+/v/9/f3//f39//39
/f/+/v3//f39//Wacv/1nHT/9aJ8//algP/2poL/9qaC//akf//1oXv/9Z12//SZb//xkmj/7Ytg/+mE
Wf/nflP/43hO/+BzSf/dbkX/2WlA/9VkPP/VZ0H//f39//7+/f/9/f3//f39//39/f/9/f3/+vr6/2Vl
Zf8AAAD0AAAAYQAAAEwAAADxaGho/vv7+//+/v7//v7+//7+/f/+/v7//v7+//7+/f/2n3j/9qN9//ar
iP/3r4//97GR//exkf/3roz/9qmG//akf//1n3f/9Jlw//GRZ//til//6oNY/+d9Uv/keE3/4XJJ/91t
RP/ZaD//2GtE//39/f/+/v3//v79//7+/v/9/f3//v7+//v7+/9nZ2f+AAAA8AAAAEsAAAAKAAAATgAA
APFpaWn++/v7//39/f/9/f3//v7+//7+/f/9/f3/962M//aqh//3tJb/+Lqf//i9ov/4vKH/97ib//ey
k//2q4n/9qR+//Wddf/0l23/8I9k/+2IXf/qglf/53xR/+N3TP/fcUf/3GxC/99+Wv/9/f3//v79//7+
/f/+/v3//f39//v7+/9oaGj+AAAA8gAAAFIAAAALAAAAAgAAAAoAAABOAAAA8WhoaP78/Pz//f39//7+
/v/+/v3//v79//nErP/3sJD/+L6j//nGr//5ybT/+ciy//jDq//4u6D/97KT//aphv/1oXv/9Zpx//OU
af/wjWH/7Ydb/+qAVf/ne0//4nVK/99wRf/pn4T//f39//7+/f/+/v3//v7+//v7+/9nZ2f/AAAA9QAA
AGcAAAATAAAAAwAAAAAAAAACAAAACgAAAFAAAADxaWlp//v7+//+/v3//v7+//7+/f/84tb/97WX//nF
rv/60L7/+tXE//rTwf/5zbj/+MOr//i4nP/3ro3/9qR///WddP/0l2z/85Jm//CLX//thVj/6n9T/+Z6
Tv/idEj/9M/A//39/f/+/v7//v79//v7+/9oaGj/AAAA+QAAAJMAAAAyAAAADAAAAAEAAAAAAAAAAAAA
AAIAAAAOAAAAWwAAAP9paWn//Pz8//7+/f/+/v3//fv6//nBp//5x7H/+tbF//vczv/72sz/+tPB//nI
sv/5vaL/97GR//amgv/2nnf/9Zhu//STaP/zj2P/8Ilc/+yDVv/pflH/6Ypj//36+P/9/f3//v79//v7
+/9oaGj/AAAA/wAAAMkAAABxAAAAKwAAAAoAAAABAAAAAAAAAAAAAAAAAAAABQAAAB8AAAD/AQAA/2ho
aP/7+/v//v79//7+/v/86N//+cSt//rTwv/73M7/+9zO//rVxP/5yrT/+L2j//exkf/2p4P/9Z53//WY
bv/0k2f/9JBj//KNXv/vh1n/7IJU//jVx//+/v3//v79//v7+/9nZ2f/AQEA/wAAAP8AAAC6AAAAbQAA
ACoAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAXAAAA/3E/Kf8MBwT/aWlp//v7+//+/v7//v7+//vc
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
AEsAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACAAAACQAAAEgAAADwAAAA7wAAAEYAAAAJAAAAAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAFAAAAPwAAAD0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAA//AA7wAAAAA/8ADvAAAAAB/wAO4AAAAAH/
AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADsAA
AAAA/wAOgAAAAAD/AA6AAAAAAP8ADgAAAAAA/wAOAAAAAAD/AA4AAAAAAP8ADgAAAAAA/wAOAAAAAAD/
AA4AAAAAAP8ADgAAAAAA/wAOAAAAAAD/AA4AAAAAAP8ADoAAAAAA/wAOwAAAAAD/AA7gAAAAAP8ADuAA
AAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAH/
AA7gAAAAAf8ADvAAAAAB/wAO+AAAAAf/AA7//gB///8ADv//AP///wAO//+B////AA4oAAAAIAAAAEAA
AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAIAAAAHAAAAGwAAAEgAAACIAAAAxQAAAMUAAACHAAAARwAAABsAAAAHAAAAAgAA
AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAA
AA0AAAARAAAAEwAAABMAAAATAAAAGAAAACoAAABUAAAAkQAAANINDQ39DAwM/QAAANIAAACQAAAAUwAA
ACoAAAAYAAAAEwAAABMAAAATAAAAEwAAABMAAAARAAAADQAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAYAAAAZAAAANwAAAEoAAABQAAAAUAAAAFQAAABhAAAAfwAAAKwAAADcDQ0N/cLCwv/BwcH/DAwM/QAA
ANwAAACsAAAAfwAAAGEAAABUAAAAUAAAAFAAAABQAAAAUAAAAEoAAAA3AAAAGQAAAAYAAAAAAAAAAAAA
AAAAAAABAAAADQAAADcAAAB4AAAAogAAAK4AAACwAAAAtgAAAMMAAADYAAAA7g0NDf7CwsL//f39//39
/f/BwcH/DAwM/gAAAO4AAADYAAAAwwAAALYAAACwAAAArwAAAK8AAACuAAAAogAAAHgAAAA3AAAADQAA
AAEAAAAAAAAAAAAAAAEAAAARAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/wsLC//39
/f/9/f3//f39//39/f/BwcH/DAwM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAogAA
AEoAAAARAAAAAQAAAAAAAAAAAAAAAQAAABMAAAD/84la/+6GWP/be1H/r2NB/3A/Kf8tGRD/Dg4N/8PD
wv/+/v3//v79//7+/f/9/f3//v7+//7+/v/BwcH/Dg0N/y0ZEP9wPyn/sGNB/9t8Uf/uhlj/84la/wAA
AP8AAACuAAAAUAAAABMAAAABAAAAAAAAAAAAAAABAAAAEwAAAP/uhlj/23tR/7BjQf9wPyn/LRkQ/w4O
Df/Dw8P//v7+//7+/f/+/v3//v79//39/f/+/v7//v7+//39/f/BwcH/Dg0M/y0ZEP9xPyn/sGNB/9t8
Uf/uhlj/AAAA/wAAAK8AAABQAAAAEwAAAAEAAAAAAAAAAAAAAAEAAAATAAAA/9t8Uf+wY0H/cUAp/y0Z
EP8ODg3/w8PC//7+/f/9/f3//v79//7+/f/9/f3//f39//7+/f/+/v3//f39//39/f/BwcH/Dg0N/y0Z
EP9xQCr/sGNB/9t8Uf8AAAD/AAAArwAAAFAAAAATAAAAAQAAAAAAAAAAAAAAAgAAABgAAAD/r2NB/3A/
Kf8tGRD/Dg4N/8PDw//+/v7//v79//nm3v/trZT/4YNh/9lrRP/VZkD/13ZW/+GeiP/14Nn//v79//7+
/f/BwcH/Dg0N/y0ZEP9wPyn/sGNB/wAAAP8AAACwAAAAUAAAABMAAAABAAAAAAAAAAAAAAAHAAAAKgAA
AP9wPyn/LRkQ/w4ODf/Dw8P//v7+//36+P/ztZr/53tO/+J1Sf/ecEX/22tB/9ZlPf/SXzn/zlo0/8tW
Mf/fmYT//Pn3//7+/v/BwcH/Dg0M/y0ZEP9wPyn/AAAA/wAAALYAAABUAAAAEwAAAAEAAAAAAAAABQAA
ABsAAABUAAAA/y0ZEP8ODg3/w8PC//7+/v/9+vn/9qiG/+6FV//qgFP/53tQ/+N2S//fcUf/22tC/9dm
Pf/SYDn/zlo0/8pVL//Xf2T//Pn3//7+/f/BwcH/Dg0M/y0ZEP8AAAD/AAAAwwAAAGEAAAAYAAAAAgAA
AAUAAAAZAAAARwAAAJAAAAD/Dg4N/8PDw//+/v7//v79//i7oP/zjF3/8oxe/++IWv/rg1b/531S/+R3
Tf/fcUj/22xD/9dmPv/TYDn/zlo0/8pVMP/fmYT//v79//39/f/BwcH/Dg0N/wAAAP8AAADYAAAAfwAA
ACoAAAAGAAAAGAAAAEYAAACKAAAA0g0NDf/Dw8L//f39//39/f/86uL/9I5g//SPYv/0kGP/849j/++K
Xv/shVn/6H9U/+R4Tv/fckj/22xD/9dmPv/TYDn/z1s1/8tWMf/14Nn//f39//7+/f/BwcH/DAwM/wAA
AO4AAACsAAAAUwAAABkAAAA6AAAAgQAAAM4NDQ39w8PD//7+/v/+/v7//v7+//i+pP/0kWT/9JNo//SV
af/0lWr/85Nn/++NYv/shlv/6H9V/+N5Tv/fckj/22xD/9dmPv/TYDn/zlo0/+GeiP/+/v3//v7+//7+
/v/BwcH/DAwM/gAAANsAAACJAAAAOgAAAFAAAAC1DQ0N/cPDw//+/v7//v7+//7+/v/+/v7/9qR///SW
a//1mnH/9Ztz//Wbc//1mnH/9JZs//CPZf/sh13/54BV/+N5T//fckj/22xD/9dmPv/SXzj/13dW//7+
/f/+/v7//v7+//39/f/BwcH/DAwM/QAAALkAAABRAAAAcA0NDfrDw8P//v7+//39/f/+/v3//v79//39
/f/1mnH/9Z52//ajfv/2pYH/9qWA//aifP/1nnb/9Jhv//CQZv/rh13/539V/+N4Tv/fckj/22tC/9Zl
Pf/VZkD//f39//39/f/+/v3//f39//39/f/BwcH/DAwM+gAAAHAAAABVDQ0N9sPDw//+/v7//f39//7+
/v/+/v7//v79//agev/2p4P/96+P//eyk//3spL/962M//ang//2oHn/9Jlv//CPZP/rhlv/6H5U/+R3
Tf/gcUf/2mpB/9lsRf/+/v3//v79//7+/v/9/f3//f39/8PDw/8NDQ32AAAAVAAAAAgAAABWDQ0N9sPD
w//9/f3//v79//7+/f/+/v3/97KT//exkf/4vaL/+cGo//jAp//4up7/97GR//ang//1nnb/85Zs/++N
Yf/rhFn/531S/+N2S//eb0X/4YNh//7+/f/+/v3//v79//39/f/CwsL/DQ0N+AAAAF8AAAAJAAAAAQAA
AAgAAABXDQ0N98PDw//+/v3//v79//7+/f/6zrr/+Lqd//nKtP/60L7/+c67//nGr//4up7/962M//ai
fP/1mXD/85Jn/++KXv/rg1b/53xQ/+J1Sf/trZT//v79//7+/v/+/v3/wsLC/w0NDfsAAACFAAAAGgAA
AAIAAAAAAAAAAQAAAAkAAABgDQ0N/8TEw//+/v3//v79//3w6v/4vaP/+tG+//vazP/72cr/+s+7//nB
p//3spL/9qWA//Wbc//0lWr/849j/++IW//rgVT/53tP//nm3v/9/f3//v7+/8PDwv8NDQ3/AAAAxAAA
AFUAAAATAAAAAQAAAAAAAAAAAAAAAgAAABoAAAD/FREQ/8TEw//+/v7//v7+//vZyf/5zbn/+9rM//vb
zP/60L7/+cKp//ezk//2pYH/9Ztz//SVaf/0kGP/8oxe/+6FV//ztZr//v7+//7+/f/Dw8P/FREQ/wAA
AP8AAACxAAAAUQAAABMAAAABAAAAAAAAAAAAAAABAAAAEwAAAP+hWjv/FREQ/8TEw//+/v3//vz7//rT
wf/5zbn/+tG+//nKtP/4vaL/96+P//ajfv/1mnH/9JNo//SPYf/zjF3/9qmG//36+f/+/v7/w8PC/xUR
EP+iWzz/AAAA/wAAAK8AAABQAAAAEwAAAAEAAAAAAAAAAAAAAAEAAAATAAAA/+yFWP+hWzv/FREQ/8TE
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
rEGAAKxBgACsQYAArEHAAaxB/D+sQQ==
</value>
</data>
</root>
\ No newline at end of file
......@@ -41,7 +41,7 @@ namespace OnlineStore.ACSingleStore
LogUtil.info("版本号[" + version + "][" + str + "][" + GetCodeNum() + "]");
return str;
}
internal static string GetCodeNum(string codeName = "RC-29-32-ACSingleStore")
internal static string GetCodeNum(string codeName = "RC1258-ACSingleStore")
{
byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(codeName);
string result = "";
......@@ -50,13 +50,7 @@ namespace OnlineStore.ACSingleStore
}
public FrmBase()
{
InitializeComponent();
//skinEngine1.SkinAllForm = false;
}
public void SetSkin(FrmBase preCon)
{
//skinEngine1.SkinFile = FormManager.SkinFileName;
//LogUtil.info("当前皮肤:" + skinEngine1.SkinFile);
}
InitializeComponent();
}
}
}
......@@ -32,11 +32,9 @@
this.label14 = new System.Windows.Forms.Label();
this.btnWriteSingleDO = new System.Windows.Forms.Button();
this.txtWriteTime = new System.Windows.Forms.TextBox();
this.btnLocationDown = new System.Windows.Forms.Button();
this.label5 = new System.Windows.Forms.Label();
this.btnReadAllDi = new System.Windows.Forms.Button();
this.cmbWriteValue = new System.Windows.Forms.ComboBox();
this.btnLocationUp = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label();
this.btnReadAllDo = new System.Windows.Forms.Button();
this.cmbWriteIO = new System.Windows.Forms.ComboBox();
......@@ -95,11 +93,9 @@
this.groupBox1.Controls.Add(this.label14);
this.groupBox1.Controls.Add(this.btnWriteSingleDO);
this.groupBox1.Controls.Add(this.txtWriteTime);
this.groupBox1.Controls.Add(this.btnLocationDown);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.btnReadAllDi);
this.groupBox1.Controls.Add(this.cmbWriteValue);
this.groupBox1.Controls.Add(this.btnLocationUp);
this.groupBox1.Controls.Add(this.label6);
this.groupBox1.Controls.Add(this.btnReadAllDo);
this.groupBox1.Controls.Add(this.cmbWriteIO);
......@@ -267,17 +263,6 @@
this.txtWriteTime.TabIndex = 238;
this.txtWriteTime.Text = "0";
//
// btnLocationDown
//
this.btnLocationDown.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnLocationDown.Location = new System.Drawing.Point(173, 248);
this.btnLocationDown.Name = "btnLocationDown";
this.btnLocationDown.Size = new System.Drawing.Size(102, 34);
this.btnLocationDown.TabIndex = 251;
this.btnLocationDown.Text = "定位气缸下降";
this.btnLocationDown.UseVisualStyleBackColor = true;
this.btnLocationDown.Click += new System.EventHandler(this.btnLocationDown_Click);
//
// label5
//
this.label5.AutoSize = true;
......@@ -316,17 +301,6 @@
this.cmbWriteValue.TabIndex = 236;
this.cmbWriteValue.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.cmbWriteValue_DrawItem);
//
// btnLocationUp
//
this.btnLocationUp.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnLocationUp.Location = new System.Drawing.Point(56, 248);
this.btnLocationUp.Name = "btnLocationUp";
this.btnLocationUp.Size = new System.Drawing.Size(102, 34);
this.btnLocationUp.TabIndex = 250;
this.btnLocationUp.Text = "定位气缸上升";
this.btnLocationUp.UseVisualStyleBackColor = true;
this.btnLocationUp.Click += new System.EventHandler(this.btnLocationUp_Click);
//
// label6
//
this.label6.AutoSize = true;
......@@ -742,8 +716,6 @@
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnCloseDoor;
private System.Windows.Forms.Button btnOpenDoor;
private System.Windows.Forms.Button btnLocationDown;
private System.Windows.Forms.Button btnLocationUp;
private System.Windows.Forms.Button btnCloseAxisBreak;
private System.Windows.Forms.Button btnOpenAxisBreak;
private System.Windows.Forms.Button button1;
......
......@@ -98,7 +98,7 @@ namespace OnlineStore.ACSingleStore
private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
{
KNDAIManager.NeedShow = false;
AIManager.Instance.NeedShow = false;
try
{
if (this.timer1.Enabled)
......@@ -121,11 +121,11 @@ namespace OnlineStore.ACSingleStore
int slaveId = FormUtil.GetIntValue(txtSlaveId);
if (time > 0)
{
KNDManager.WriteSingleDO(deviceName, (byte)slaveId, (ushort)index, (IO_VALUE)value, time);
IOManager.instance.WriteSingleDO(deviceName, (byte)slaveId, (ushort)index, (IO_VALUE)value, time);
}
else
{
KNDManager.WriteSingleDO(deviceName, (byte)slaveId, (ushort)index, (IO_VALUE)value);
IOManager.instance.WriteSingleDO(deviceName, (byte)slaveId, (ushort)index, (IO_VALUE)value);
}
}
......@@ -159,7 +159,7 @@ namespace OnlineStore.ACSingleStore
private void FrmStoreIOStatus_Load(object sender, EventArgs e)
{
KNDAIManager.NeedShow = true;
AIManager.Instance.NeedShow = true;
}
private void cmbWriteIO_DrawItem(object sender, DrawItemEventArgs e)
......@@ -201,7 +201,7 @@ namespace OnlineStore.ACSingleStore
foreach (string key in DIControlList.Keys)
{
IOTextControl control = DIControlList[key];
int iov = (int)KNDManager.GetIOValue(boxBean.Config.StoreDIList[key]);
int iov = (int)IOManager.instance.GetIOValue(boxBean.Config.StoreDIList[key]);
if (iov != control.IOValue)
{
control.IOValue = iov;
......@@ -210,7 +210,7 @@ namespace OnlineStore.ACSingleStore
} foreach (string key in this.DOControlList.Keys)
{
IOTextControl control = DOControlList[key];
int iov = (int)KNDManager.GetIOValue(boxBean.Config.StoreDOList[key]);
int iov = (int)IOManager.instance.GetIOValue(boxBean.Config.StoreDOList[key]);
if (iov != control.IOValue)
{
control.IOValue = iov;
......@@ -218,11 +218,11 @@ namespace OnlineStore.ACSingleStore
}
}
double ai1Value = KNDAIManager.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI1_Addr);
double ai2Value = KNDAIManager.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI2_Addr);
double ai3Value = KNDAIManager.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI3_Addr);
double ai4Value = KNDAIManager.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI4_Addr);
//double ai3Value = KNDAIManager.GetAIValue(boxBean.Config.AIDevice_IP, 3);
double ai1Value = AIManager.Instance.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI1_Addr);
double ai2Value = AIManager.Instance.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI2_Addr);
double ai3Value = AIManager.Instance.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI3_Addr);
double ai4Value = AIManager.Instance.GetAIValue(boxBean.Config.AIDevice_IP, StoreManager.Config.AIDI4_Addr);
//double ai3Value = AIManager.Instance.GetAIValue(boxBean.Config.AIDevice_IP, 3);
txtAI1.Text = ai1Value.ToString();
txtAI2.Text = ai2Value.ToString();
......@@ -230,11 +230,11 @@ namespace OnlineStore.ACSingleStore
txtAI4.Text = ai4Value.ToString();
//txtAI3.Text = ai3Value.ToString();
txtAIResult1.Text = KNDAIManager.ConvertAI(ai1Value,boxBean.Config.AIDI1_DefaultPosition).ToString();
txtAIResult2.Text = KNDAIManager.ConvertAI(ai2Value, boxBean.Config.AIDI2_DefaultPosition).ToString();
txtAIResult3.Text = KNDAIManager.ConvertAI(ai3Value, boxBean.Config.AIDI3_DefaultPosition).ToString();
txtAIResult4.Text = KNDAIManager.ConvertAI(ai4Value, boxBean.Config.AIDI4_DefaultPosition).ToString();
//txtAIResult3.Text = KNDAIManager.ConvertAI(ai3Value, boxBean.Config.AIDI3_DefaultPosition).ToString();
txtAIResult1.Text = AIManager.ConvertAI(ai1Value,boxBean.Config.AIDI1_DefaultPosition).ToString();
txtAIResult2.Text = AIManager.ConvertAI(ai2Value, boxBean.Config.AIDI2_DefaultPosition).ToString();
txtAIResult3.Text = AIManager.ConvertAI(ai3Value, boxBean.Config.AIDI3_DefaultPosition).ToString();
txtAIResult4.Text = AIManager.ConvertAI(ai4Value, boxBean.Config.AIDI4_DefaultPosition).ToString();
//txtAIResult3.Text = AIManager.ConvertAI(ai3Value, boxBean.Config.AIDI3_DefaultPosition).ToString();
txtHeight.Text = boxBean.GetHeight().ToString();
txtSize.Text = boxBean.GetSize().ToString();
......@@ -246,7 +246,7 @@ namespace OnlineStore.ACSingleStore
IO_VALUE value = (IO_VALUE)cmbWriteValue.SelectedIndex;
int time = FormUtil.GetIntValue(txtWriteTime);
int slaveId = FormUtil.GetIntValue(txtSlaveId);
KNDManager.ReadMultipleDI(deviceName, (byte)slaveId, (ushort)KNDManager.DIStartAddress, 16);
IOManager.instance.ReadAllDI(deviceName, (byte)slaveId );
}
private void btnReadAllDo_Click(object sender, EventArgs e)
{
......@@ -255,45 +255,32 @@ namespace OnlineStore.ACSingleStore
IO_VALUE value = (IO_VALUE)cmbWriteValue.SelectedIndex;
int time = FormUtil.GetIntValue(txtWriteTime);
int slaveId = FormUtil.GetIntValue(txtSlaveId);
KNDManager.ReadMultipleDO(deviceName, (byte)slaveId, (ushort)KNDManager.DoStartAddress, 16);
IOManager.instance.ReadAllDO(deviceName, (byte)slaveId);
}
private void btnOpenDoor_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
boxBean.KNDIOMove(IO_Type.Door_Down, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.LOW);
}
private void btnCloseDoor_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
boxBean.KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
}
private void btnLocationUp_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
boxBean.KNDIOMove(IO_Type.LocationCylinder_Up, IO_VALUE.HIGH);
}
private void btnLocationDown_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.HIGH);
boxBean.KNDIOMove(IO_Type.LocationCylinder_Up, IO_VALUE.LOW);
}
private void FrmIOStatus_Shown(object sender, EventArgs e)
{
SetSkin(this);
{
timer1.Start();
}
private void btnOpenAxisBreak_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.HIGH);
}
private void btnCloseAxisBreak_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
}
private void button1_Click(object sender, EventArgs e)
......@@ -303,12 +290,12 @@ namespace OnlineStore.ACSingleStore
private void btnOpenLed_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
}
private void btnCloseLed_Click(object sender, EventArgs e)
{
boxBean.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);
}
}
}
......@@ -174,30 +174,6 @@
this.显示ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
this.groupComAxis = new System.Windows.Forms.GroupBox();
this.label20 = new System.Windows.Forms.Label();
this.txtComAPosition = new System.Windows.Forms.TextBox();
this.lblShuoKeMsg = new System.Windows.Forms.Label();
this.btnRelMove = new System.Windows.Forms.Button();
this.txtAddr = new System.Windows.Forms.TextBox();
this.label18 = new System.Windows.Forms.Label();
this.btnGetPosition = new System.Windows.Forms.Button();
this.cmbHomeType = new System.Windows.Forms.ComboBox();
this.label13 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
this.txtSpeed = new System.Windows.Forms.TextBox();
this.btnVolMove = new System.Windows.Forms.Button();
this.btnClose = new System.Windows.Forms.Button();
this.btnOpen = new System.Windows.Forms.Button();
this.btnStatusSearch = new System.Windows.Forms.Button();
this.label19 = new System.Windows.Forms.Label();
this.txtLinePosition = new System.Windows.Forms.TextBox();
this.btnHomeMove = new System.Windows.Forms.Button();
this.btnClearPosition = new System.Windows.Forms.Button();
this.btnStop = new System.Windows.Forms.Button();
this.btnLineAbsMove = new System.Windows.Forms.Button();
this.label25 = new System.Windows.Forms.Label();
this.comboBoxPortName = new System.Windows.Forms.ComboBox();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.btnCloseLed = new System.Windows.Forms.Button();
......@@ -254,13 +230,13 @@
this.button4 = new System.Windows.Forms.Button();
this.btnClearL = new System.Windows.Forms.Button();
this.btnLogDebug = new System.Windows.Forms.Button();
this.chbBuzzer = new System.Windows.Forms.CheckBox();
this.groupAxis.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupInout.SuspendLayout();
this.menuStrip1.SuspendLayout();
this.groupBox3.SuspendLayout();
this.contextMenuStrip1.SuspendLayout();
this.groupComAxis.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage3.SuspendLayout();
this.tabPage1.SuspendLayout();
......@@ -2039,263 +2015,6 @@
this.notifyIcon1.Text = "料仓客户端";
this.notifyIcon1.Visible = true;
//
// groupComAxis
//
this.groupComAxis.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupComAxis.Controls.Add(this.label20);
this.groupComAxis.Controls.Add(this.txtComAPosition);
this.groupComAxis.Controls.Add(this.lblShuoKeMsg);
this.groupComAxis.Controls.Add(this.btnRelMove);
this.groupComAxis.Controls.Add(this.txtAddr);
this.groupComAxis.Controls.Add(this.label18);
this.groupComAxis.Controls.Add(this.btnGetPosition);
this.groupComAxis.Controls.Add(this.cmbHomeType);
this.groupComAxis.Controls.Add(this.label13);
this.groupComAxis.Controls.Add(this.label17);
this.groupComAxis.Controls.Add(this.txtSpeed);
this.groupComAxis.Controls.Add(this.btnVolMove);
this.groupComAxis.Controls.Add(this.btnClose);
this.groupComAxis.Controls.Add(this.btnOpen);
this.groupComAxis.Controls.Add(this.btnStatusSearch);
this.groupComAxis.Controls.Add(this.label19);
this.groupComAxis.Controls.Add(this.txtLinePosition);
this.groupComAxis.Controls.Add(this.btnHomeMove);
this.groupComAxis.Controls.Add(this.btnClearPosition);
this.groupComAxis.Controls.Add(this.btnStop);
this.groupComAxis.Controls.Add(this.btnLineAbsMove);
this.groupComAxis.Controls.Add(this.label25);
this.groupComAxis.Controls.Add(this.comboBoxPortName);
this.groupComAxis.Enabled = false;
this.groupComAxis.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupComAxis.Location = new System.Drawing.Point(7, 8);
this.groupComAxis.Name = "groupComAxis";
this.groupComAxis.Size = new System.Drawing.Size(544, 274);
this.groupComAxis.TabIndex = 271;
this.groupComAxis.TabStop = false;
this.groupComAxis.Text = "压紧轴";
//
// label20
//
this.label20.AutoSize = true;
this.label20.Location = new System.Drawing.Point(8, 164);
this.label20.Name = "label20";
this.label20.Size = new System.Drawing.Size(68, 17);
this.label20.TabIndex = 99;
this.label20.Text = "实时位置:";
//
// txtComAPosition
//
this.txtComAPosition.Location = new System.Drawing.Point(79, 157);
this.txtComAPosition.MaxLength = 15;
this.txtComAPosition.Name = "txtComAPosition";
this.txtComAPosition.Size = new System.Drawing.Size(103, 23);
this.txtComAPosition.TabIndex = 98;
this.txtComAPosition.Text = "-1";
//
// lblShuoKeMsg
//
this.lblShuoKeMsg.AutoSize = true;
this.lblShuoKeMsg.ForeColor = System.Drawing.Color.Green;
this.lblShuoKeMsg.Location = new System.Drawing.Point(76, 242);
this.lblShuoKeMsg.Name = "lblShuoKeMsg";
this.lblShuoKeMsg.Size = new System.Drawing.Size(80, 17);
this.lblShuoKeMsg.TabIndex = 97;
this.lblShuoKeMsg.Text = "步进电机信息";
//
// btnRelMove
//
this.btnRelMove.Location = new System.Drawing.Point(299, 68);
this.btnRelMove.Name = "btnRelMove";
this.btnRelMove.Size = new System.Drawing.Size(105, 33);
this.btnRelMove.TabIndex = 96;
this.btnRelMove.Text = "相对运动";
this.btnRelMove.UseVisualStyleBackColor = true;
this.btnRelMove.Click += new System.EventHandler(this.btnRelMove_Click);
//
// txtAddr
//
this.txtAddr.Enabled = false;
this.txtAddr.Location = new System.Drawing.Point(235, 31);
this.txtAddr.Name = "txtAddr";
this.txtAddr.Size = new System.Drawing.Size(48, 23);
this.txtAddr.TabIndex = 95;
this.txtAddr.Text = "1";
//
// label18
//
this.label18.AutoSize = true;
this.label18.Location = new System.Drawing.Point(192, 34);
this.label18.Name = "label18";
this.label18.Size = new System.Drawing.Size(44, 17);
this.label18.TabIndex = 94;
this.label18.Text = "地址:";
//
// btnGetPosition
//
this.btnGetPosition.Location = new System.Drawing.Point(188, 152);
this.btnGetPosition.Name = "btnGetPosition";
this.btnGetPosition.Size = new System.Drawing.Size(105, 33);
this.btnGetPosition.TabIndex = 93;
this.btnGetPosition.Text = "查询位置";
this.btnGetPosition.UseVisualStyleBackColor = true;
this.btnGetPosition.Click += new System.EventHandler(this.btnGetPosition_Click);
//
// cmbHomeType
//
this.cmbHomeType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbHomeType.FormattingEnabled = true;
this.cmbHomeType.Items.AddRange(new object[] {
"0=反方向",
"1=正方向"});
this.cmbHomeType.Location = new System.Drawing.Point(79, 199);
this.cmbHomeType.Name = "cmbHomeType";
this.cmbHomeType.Size = new System.Drawing.Size(103, 25);
this.cmbHomeType.TabIndex = 92;
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(8, 206);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(68, 17);
this.label13.TabIndex = 91;
this.label13.Text = "原点方向:";
//
// label17
//
this.label17.AutoSize = true;
this.label17.Location = new System.Drawing.Point(32, 121);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(44, 17);
this.label17.TabIndex = 90;
this.label17.Text = "速度:";
//
// txtSpeed
//
this.txtSpeed.Location = new System.Drawing.Point(79, 115);
this.txtSpeed.MaxLength = 15;
this.txtSpeed.Name = "txtSpeed";
this.txtSpeed.Size = new System.Drawing.Size(103, 23);
this.txtSpeed.TabIndex = 89;
this.txtSpeed.Text = "10000";
//
// btnVolMove
//
this.btnVolMove.Location = new System.Drawing.Point(188, 110);
this.btnVolMove.Name = "btnVolMove";
this.btnVolMove.Size = new System.Drawing.Size(105, 33);
this.btnVolMove.TabIndex = 88;
this.btnVolMove.Text = "匀速运动";
this.btnVolMove.UseVisualStyleBackColor = true;
this.btnVolMove.Click += new System.EventHandler(this.btnVolMove_Click);
//
// btnClose
//
this.btnClose.Location = new System.Drawing.Point(409, 26);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(105, 33);
this.btnClose.TabIndex = 87;
this.btnClose.Text = "关闭串口";
this.btnClose.UseVisualStyleBackColor = true;
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
//
// btnOpen
//
this.btnOpen.Location = new System.Drawing.Point(298, 26);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(105, 33);
this.btnOpen.TabIndex = 86;
this.btnOpen.Text = "打开串口";
this.btnOpen.UseVisualStyleBackColor = true;
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// btnStatusSearch
//
this.btnStatusSearch.Location = new System.Drawing.Point(299, 194);
this.btnStatusSearch.Name = "btnStatusSearch";
this.btnStatusSearch.Size = new System.Drawing.Size(105, 33);
this.btnStatusSearch.TabIndex = 85;
this.btnStatusSearch.Text = "查询运动状态";
this.btnStatusSearch.UseVisualStyleBackColor = true;
this.btnStatusSearch.Click += new System.EventHandler(this.btnStatusSearch_Click);
//
// label19
//
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(32, 76);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(44, 17);
this.label19.TabIndex = 84;
this.label19.Text = "位置:";
//
// txtLinePosition
//
this.txtLinePosition.Location = new System.Drawing.Point(79, 73);
this.txtLinePosition.MaxLength = 15;
this.txtLinePosition.Name = "txtLinePosition";
this.txtLinePosition.Size = new System.Drawing.Size(103, 23);
this.txtLinePosition.TabIndex = 83;
this.txtLinePosition.Text = "-10000";
//
// btnHomeMove
//
this.btnHomeMove.Location = new System.Drawing.Point(188, 194);
this.btnHomeMove.Name = "btnHomeMove";
this.btnHomeMove.Size = new System.Drawing.Size(105, 33);
this.btnHomeMove.TabIndex = 12;
this.btnHomeMove.Text = "原点返回";
this.btnHomeMove.UseVisualStyleBackColor = true;
this.btnHomeMove.Click += new System.EventHandler(this.btnHomeMove_Click);
//
// btnClearPosition
//
this.btnClearPosition.Location = new System.Drawing.Point(299, 152);
this.btnClearPosition.Name = "btnClearPosition";
this.btnClearPosition.Size = new System.Drawing.Size(105, 33);
this.btnClearPosition.TabIndex = 11;
this.btnClearPosition.Text = "清理位置";
this.btnClearPosition.UseVisualStyleBackColor = true;
this.btnClearPosition.Click += new System.EventHandler(this.btnClearPosition_Click);
//
// btnStop
//
this.btnStop.Location = new System.Drawing.Point(298, 110);
this.btnStop.Name = "btnStop";
this.btnStop.Size = new System.Drawing.Size(105, 33);
this.btnStop.TabIndex = 10;
this.btnStop.Text = "紧急停止";
this.btnStop.UseVisualStyleBackColor = true;
this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
//
// btnLineAbsMove
//
this.btnLineAbsMove.Location = new System.Drawing.Point(188, 68);
this.btnLineAbsMove.Name = "btnLineAbsMove";
this.btnLineAbsMove.Size = new System.Drawing.Size(105, 33);
this.btnLineAbsMove.TabIndex = 9;
this.btnLineAbsMove.Text = "绝对运动";
this.btnLineAbsMove.UseVisualStyleBackColor = true;
this.btnLineAbsMove.Click += new System.EventHandler(this.btnLineAbsMove_Click);
//
// label25
//
this.label25.AutoSize = true;
this.label25.Location = new System.Drawing.Point(20, 34);
this.label25.Name = "label25";
this.label25.Size = new System.Drawing.Size(56, 17);
this.label25.TabIndex = 1;
this.label25.Text = "端口号:";
//
// comboBoxPortName
//
this.comboBoxPortName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxPortName.FormattingEnabled = true;
this.comboBoxPortName.Location = new System.Drawing.Point(79, 30);
this.comboBoxPortName.Name = "comboBoxPortName";
this.comboBoxPortName.Size = new System.Drawing.Size(103, 25);
this.comboBoxPortName.TabIndex = 0;
//
// tabControl1
//
this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
......@@ -2389,7 +2108,6 @@
//
this.tabPage2.Controls.Add(this.groupCode);
this.tabPage2.Controls.Add(this.groupBox7);
this.tabPage2.Controls.Add(this.groupComAxis);
this.tabPage2.Location = new System.Drawing.Point(4, 29);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
......@@ -2406,7 +2124,7 @@
this.groupCode.Controls.Add(this.label31);
this.groupCode.Controls.Add(this.btnCodeTest);
this.groupCode.Controls.Add(this.btnOpenFile);
this.groupCode.Location = new System.Drawing.Point(7, 414);
this.groupCode.Location = new System.Drawing.Point(10, 135);
this.groupCode.Name = "groupCode";
this.groupCode.Size = new System.Drawing.Size(544, 197);
this.groupCode.TabIndex = 273;
......@@ -2465,7 +2183,6 @@
this.btnCodeTest.TabIndex = 245;
this.btnCodeTest.Text = "扫码测试";
this.btnCodeTest.UseVisualStyleBackColor = true;
// this.btnCodeTest.Click += new System.EventHandler(this.btnCodeTest_Click);
//
// btnOpenFile
//
......@@ -2475,7 +2192,6 @@
this.btnOpenFile.TabIndex = 244;
this.btnOpenFile.Text = "打开本地图片";
this.btnOpenFile.UseVisualStyleBackColor = true;
// this.btnOpenFile.Click += new System.EventHandler(this.btnOpenFile_Click);
//
// groupBox7
//
......@@ -2489,7 +2205,7 @@
this.groupBox7.Controls.Add(this.label27);
this.groupBox7.Controls.Add(this.btnTempClose);
this.groupBox7.Controls.Add(this.btnTempInit);
this.groupBox7.Location = new System.Drawing.Point(7, 285);
this.groupBox7.Location = new System.Drawing.Point(10, 6);
this.groupBox7.Name = "groupBox7";
this.groupBox7.Size = new System.Drawing.Size(544, 126);
this.groupBox7.TabIndex = 272;
......@@ -2749,6 +2465,7 @@
//
// tabPage4
//
this.tabPage4.Controls.Add(this.chbBuzzer);
this.tabPage4.Controls.Add(this.btnStoreExit);
this.tabPage4.Controls.Add(this.btnStoreHome);
this.tabPage4.Controls.Add(this.chbAuto);
......@@ -2957,6 +2674,19 @@
this.btnLogDebug.UseVisualStyleBackColor = true;
this.btnLogDebug.Click += new System.EventHandler(this.开启DEBUGToolStripMenuItem_Click);
//
// chbBuzzer
//
this.chbBuzzer.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.chbBuzzer.AutoSize = true;
this.chbBuzzer.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.chbBuzzer.Location = new System.Drawing.Point(761, 13);
this.chbBuzzer.Name = "chbBuzzer";
this.chbBuzzer.Size = new System.Drawing.Size(109, 25);
this.chbBuzzer.TabIndex = 271;
this.chbBuzzer.Text = "启用蜂鸣器";
this.chbBuzzer.UseVisualStyleBackColor = true;
this.chbBuzzer.CheckedChanged += new System.EventHandler(this.chbBuzzer_CheckedChanged);
//
// FrmStoreBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
......@@ -2988,8 +2718,6 @@
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.contextMenuStrip1.ResumeLayout(false);
this.groupComAxis.ResumeLayout(false);
this.groupComAxis.PerformLayout();
this.tabControl1.ResumeLayout(false);
this.tabPage3.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
......@@ -3162,34 +2890,10 @@
private System.Windows.Forms.TextBox txtHomeSingle;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.GroupBox groupComAxis;
private System.Windows.Forms.Button btnRelMove;
private System.Windows.Forms.TextBox txtAddr;
private System.Windows.Forms.Label label18;
private System.Windows.Forms.Button btnGetPosition;
private System.Windows.Forms.ComboBox cmbHomeType;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label17;
private System.Windows.Forms.TextBox txtSpeed;
private System.Windows.Forms.Button btnVolMove;
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.Button btnStatusSearch;
private System.Windows.Forms.Label label19;
private System.Windows.Forms.TextBox txtLinePosition;
private System.Windows.Forms.Button btnHomeMove;
private System.Windows.Forms.Button btnClearPosition;
private System.Windows.Forms.Button btnStop;
private System.Windows.Forms.Button btnLineAbsMove;
private System.Windows.Forms.Label label25;
private System.Windows.Forms.ComboBox comboBoxPortName;
private System.Windows.Forms.Label lblShuoKeMsg;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.Label label20;
private System.Windows.Forms.TextBox txtComAPosition;
private System.Windows.Forms.GroupBox groupBox7;
private System.Windows.Forms.Button btnSelTemp;
private System.Windows.Forms.TextBox txtHum;
......@@ -3242,6 +2946,7 @@
private System.Windows.Forms.Button btnOpenFile;
private System.Windows.Forms.TextBox txtCode;
private System.Windows.Forms.Label label32;
private System.Windows.Forms.CheckBox chbBuzzer;
}
}
......@@ -46,7 +46,7 @@ namespace OnlineStore.ACSingleStore
LogUtil.error(LOGGER, "找不到对应的料仓");
return;
}
txtSpeed.Text = store.Config.CompressAxis_EndSpeed.ToString();
cmbAxisList.DataSource = new List<ConfigMoveAxis>(store.moveAxisList);
cmbAxisList.DisplayMember = "Explain";
cmbAxisList.ValueMember = "Explain";
......@@ -88,14 +88,7 @@ namespace OnlineStore.ACSingleStore
txtInOutP2.Text = ktkPosition.InOutAxis_DoorPosition_P2.ToString();
//txtUpDownP1.Text = ktkPosition.UpDownAxis_DoorOPosition_P1.ToString();
}
List<string> port = new List<string>(SerialPort.GetPortNames());
comboBoxPortName.DataSource = port;
if (port.IndexOf(store.Config.CompressAxis_PortName) >= 0)
{
comboBoxPortName.SelectedIndex = port.IndexOf(store.Config.CompressAxis_PortName);
}
cmbHomeType.SelectedIndex = 0;
timer1.Enabled = true;
}
#endregion
......@@ -153,8 +146,8 @@ namespace OnlineStore.ACSingleStore
this.Text = ConfigAppSettings.GetValue(Setting_Init.App_Title);
notifyIcon1.Text = ConfigAppSettings.GetValue(Setting_Init.App_Title);
LoadOk = true;
cmbHomeType.SelectedIndex = 1;
this.chbBuzzer.Checked = store.UseBuzzer;
LoadOk = true;
HideForm();
this.Opacity = 1;
txtTempPort.Text = store.Config.Humiture_Port;
......@@ -249,13 +242,20 @@ namespace OnlineStore.ACSingleStore
if (store.Config.IsHasDoorLimit.Equals(1))
{
if (store.KNDIOValue(IO_Type.Door_LimitSingle).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.Door_Limit).Equals(IO_VALUE.LOW))
{
lblWarnMsg.Text = lblWarnMsg.Text + " 前门未关";
}else if (store.Config.StoreDIList.ContainsKey(IO_Type.Door_LeftLimit)&& IOManager.IOValue(IO_Type.Door_LeftLimit).Equals(IO_VALUE.LOW))
{
lblWarnMsg.Text = lblWarnMsg.Text + " 左侧门未关";
}
else if (store.Config.StoreDIList.ContainsKey(IO_Type.Door_RightLimit) && IOManager.IOValue(IO_Type.Door_RightLimit).Equals(IO_VALUE.LOW))
{
lblWarnMsg.Text = lblWarnMsg.Text + " 右侧门未关";
}
}
//如果不在出入库中,且叉子上有信号,需要提示检查叉子
if (store.storeRunStatus.Equals(StoreRunStatus.Runing) && store.KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
if (store.storeRunStatus.Equals(StoreRunStatus.Runing) && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
lblWarnMsg.Text = lblWarnMsg.Text + " 叉子料盘检测有料,请检查";
}
......@@ -866,19 +866,22 @@ namespace OnlineStore.ACSingleStore
private void btnComP2_Click(object sender, EventArgs e)
{
int value = FormUtil.GetIntValue(txtComP2);
ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
AxisABSMove(store.Config.Comp_Axis, value, store.Config.CompAxis_P2_Speed);
//ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
}
private void btnComP1_Click(object sender, EventArgs e)
{
int value = FormUtil.GetIntValue(txtComP1);
ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
AxisABSMove(store.Config.Comp_Axis, value, store.Config.CompAxis_P1_Speed);
//ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
}
private void btnComP3_Click(object sender, EventArgs e)
{
int value = FormUtil.GetIntValue(txtComP3);
ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
AxisABSMove(store.Config.Comp_Axis, value, store.Config.CompAxis_P3_Speed);
//ShuoKeControls.AbsMove(store.Config.CompressAxis_Slv, value);
}
int xWidth = SystemInformation.PrimaryMonitorSize.Width;//获取显示器屏幕宽度
int yHeight = SystemInformation.PrimaryMonitorSize.Height;//高度
......@@ -1001,7 +1004,7 @@ namespace OnlineStore.ACSingleStore
private void 扫码测试ToolStripMenuItem_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
string message = "";
List<string> codeList = CodeManager.CameraScan();
foreach (string str in codeList)
......@@ -1009,13 +1012,13 @@ namespace OnlineStore.ACSingleStore
message = message + str + "##";
}
LogUtil.info("扫码测试收到二维码 :" + message);
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);
}
private void 打开舱门ToolStripMenuItem_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
store.KNDIOMove(IO_Type.Door_Down, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.LOW);
}
private void 料仓运转OFFToolStripMenuItem_Click(object sender, EventArgs e)
......@@ -1026,8 +1029,8 @@ namespace OnlineStore.ACSingleStore
private void 关闭仓门ToolStripMenuItem_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
store.KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
}
private void 回待机点ToolStripMenuItem_Click(object sender, EventArgs e)
......@@ -1051,13 +1054,11 @@ namespace OnlineStore.ACSingleStore
private void 换肤ToolStripMenuItem_Click(object sender, EventArgs e)
{
FormManager.NextSkin();
SetSkin(this);
FormManager.NextSkin();
}
private void FrmStoreBox_Shown(object sender, EventArgs e)
{
SetSkin(this);
{
this.btnUpDownP1.ForeColor = System.Drawing.Color.Red;
this.btnUpDownP2.ForeColor = System.Drawing.Color.Red;
this.btnUpDownP3.ForeColor = System.Drawing.Color.Red;
......@@ -1266,10 +1267,10 @@ namespace OnlineStore.ACSingleStore
stop_button_Click(null, null);
}
KNDManager.CloseAllDO();
IOManager.instance.CloseAllDO();
StoreOpenStatus(false);
KNDManager.CloseAllConnection();
KNDAIManager.CloseAllConnection();
IOManager.instance.CloseAllConnection();
AIManager.Instance.CloseConnect();
ACServerManager.CloseAllPort();
//WCFControl.CloseWCF();
......@@ -1319,10 +1320,10 @@ namespace OnlineStore.ACSingleStore
{
// if (CodeManager.DeCodeType.Equals(0))
{
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
CodeLibrary.FrmCodeDecode frm = new FrmCodeDecode();
frm.ShowDialog();
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);
}
}
......@@ -1331,73 +1332,7 @@ namespace OnlineStore.ACSingleStore
{
int value = ACServerManager.GetHomeSingle(GetPortName(), GetSlaveAddr());
this.txtHomeSingle.Text = value.ToString();
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (StoreManager.OpenShuoKe(store))
{
store.SetShuokeSpeed();
FormComStatus(true);
}
}
private void btnClose_Click(object sender, EventArgs e)
{
ShuoKeControls.ClosePort();
FormComStatus(false);
}
private void btnVolMove_Click(object sender, EventArgs e)
{
int speed = FormUtil.GetIntValue(txtSpeed);
ShuoKeControls.VolMove(store.Config.CompressAxis_Slv, speed);
}
private void btnGetPosition_Click(object sender, EventArgs e)
{
int value = ShuoKeControls.GetABSPosition(store.Config.CompressAxis_Slv);
txtComAPosition.Text = value.ToString();
lblShuoKeMsg.Text = DateTime.Now.ToLongTimeString() + "实时位置:" + value;
}
private void btnStop_Click(object sender, EventArgs e)
{
ShuoKeControls.SuddownStop(this.store.Config.CompressAxis_Slv);
}
private void btnClearPosition_Click(object sender, EventArgs e)
{
ShuoKeControls.PositionClear(this.store.Config.CompressAxis_Slv, ShuoKeCMD.AbsPositionClear);
ShuoKeControls.PositionClear(this.store.Config.CompressAxis_Slv, ShuoKeCMD.RelPositionClear);
}
private void btnHomeMove_Click(object sender, EventArgs e)
{
ShuoKeControls.HomeMove(this.store.Config.CompressAxis_Slv, byte.Parse(cmbHomeType.SelectedIndex.ToString()));
}
private void btnLineAbsMove_Click(object sender, EventArgs e)
{
int posi = FormUtil.GetIntValue(txtLinePosition);
ShuoKeControls.AbsMove(this.store.Config.CompressAxis_Slv, posi);
}
private void btnRelMove_Click(object sender, EventArgs e)
{
int posi = FormUtil.GetIntValue(txtLinePosition);
ShuoKeControls.RelativeMove(this.store.Config.CompressAxis_Slv, posi);
}
private void btnStatusSearch_Click(object sender, EventArgs e)
{
ShuoKeInfo info = ShuoKeControls.GetStatus(store.Config.CompressAxis_Slv);
lblShuoKeMsg.Text = info.ToShowStr();
}
private void FormComStatus(bool isOpen)
{
btnOpen.Enabled = !isOpen;
btnClose.Enabled = isOpen;
btnClearPosition.Enabled = isOpen;
btnVolMove.Enabled = isOpen;
btnGetPosition.Enabled = isOpen;
btnHomeMove.Enabled = isOpen;
btnLineAbsMove.Enabled = isOpen;
btnStatusSearch.Enabled = isOpen;
// Bt_ClearCounter.Enabled = isOpen;
}
}
private void btnTempInit_Click(object sender, EventArgs e)
{
string port = txtTempPort.Text.ToString();
......@@ -1422,18 +1357,18 @@ namespace OnlineStore.ACSingleStore
private void btnOpenDoor_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
store.KNDIOMove(IO_Type.Door_Down, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.LOW);
}
private void btnOpenLed_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
}
private void btnCloseLed_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);
}
private void btnClearL_Click(object sender, EventArgs e)
......@@ -1456,8 +1391,7 @@ namespace OnlineStore.ACSingleStore
{
btnDebug.Text = "启用调试";
}
groupAxis.Enabled = status;
groupComAxis.Enabled = status;
groupAxis.Enabled = status;
groupInout.Enabled = status;
}
......@@ -1492,8 +1426,28 @@ namespace OnlineStore.ACSingleStore
private void btnCloseDoor_Click(object sender, EventArgs e)
{
store.KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
store.KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
}
private void chbBuzzer_CheckedChanged(object sender, EventArgs e)
{
if (!LoadOk)
{
return;
}
if (chbBuzzer.Checked)
{
ConfigAppSettings.SaveValue(Setting_Init.UseBuzzer, 1);
store.UseBuzzer = true;
LogUtil.info("勾选:启用蜂鸣器");
}
else
{
ConfigAppSettings.SaveValue(Setting_Init.App_AutoRun, 0);
store.UseBuzzer = false;
LogUtil.info("去掉:启用蜂鸣器");
}
}
//private void btnOpenFile_Click(object sender, EventArgs e)
......
using log4net;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.ServiceModel;
using System.Text;
namespace OnlineStore.ACSingleStore
{
public class WCFControl
{
//public static bool isRun=false;
//public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//private static ServiceHost host = null;
//public static void OpenWCF()
//{
// if (isRun)
// {
// return;
// }
// try
// {
// if (host == null)
// {
// host = new ServiceHost(typeof(AcStoreWCF.CWSMDBox));
// }
// if (host.State != CommunicationState.Opening)
// {
// host.Open();
// }
// isRun = true;
// LogUtil.info("打开WCF服务成功");
// }
// catch (Exception ex)
// {
// LogUtil.error("打开WCF服务出错:" + ex.ToString());
// }
//}
//public static void CloseWCF()
//{
// try
// {
// isRun = false;
// if (host != null)
// {
// host.Close();
// }
// LogUtil.info("关闭WCF服务成功");
// }
// catch (Exception ex)
// {
// LogUtil.error("关闭WCF服务出错:" + ex.ToString());
// }
//}
}
}
......@@ -90,4 +90,5 @@ DeCodeType=解码类型,0=halcon,1=zxing解码 西安料仓解析方式。2=
20191102修改:
在RC-29-32-ACSingleStore基础上新建分支:RC1258-ACSingleStore
主要修改内容:压紧轴改为伺服控制。IO模块使用零点模块。
\ No newline at end of file
主要修改内容:压紧轴改为伺服控制。IO模块使用零点模块。
使用新IO定义。增加蜂鸣器处理
\ No newline at end of file
......@@ -61,10 +61,7 @@ namespace OnlineStore.Common
/// 配置文件路径 Data Matrix ECC 200.dcm
/// </summary>
public static string CodeParamPath = "CodeParamPath";
/// <summary>
/// 高度传感器转换系数
/// </summary>
public static string AI_ConvertPosition = "AI_ConvertPosition";
/// <summary>
/// 进出轴最大待机点,需要小于3000
/// </summary>
......@@ -75,10 +72,7 @@ namespace OnlineStore.Common
/// 出库等待料盘拿走的时间,秒
/// </summary>
public static string OutStoreWaitSeconds = "OutStoreWaitSeconds";
/// <summary>
/// 压紧轴1mm对应的脉冲
/// </summary>
public static string ComAxisChangeValue = "ComAxisChangeValue";
/// <summary>
/// 温控器类型,0=壁挂王字壳温湿度变送器,1=妙昕温湿度记录仪
......@@ -90,5 +84,10 @@ namespace OnlineStore.Common
/// </summary>
public static string DeCodeType = "DeCodeType";
public static string DefaultPWD = "DefaultPWD";
public static string UseAIOBOX = "UseAIOBOX";
/// <summary>
/// 是否打开蜂鸣器
/// </summary>
public static string UseBuzzer = "UseBuzzer";
}
}
......@@ -36,6 +36,9 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Asa.IOModule.AIOBOX">
<HintPath>..\..\dll\Asa.IOModule.AIOBOX.dll</HintPath>
</Reference>
<Reference Include="CodeLibrary">
<HintPath>..\..\dll\CodeLibrary.dll</HintPath>
</Reference>
......@@ -63,15 +66,17 @@
<Compile Include="acSingleStore\AC_SA_BoxBean_Partial.cs" />
<Compile Include="acSingleStore\StoreManager.cs" />
<Compile Include="halcon\CodeManager.cs" />
<Compile Include="KangNaiDe\AITcpClient.cs" />
<Compile Include="KangNaiDe\KNDAIManager.cs" />
<Compile Include="KangNaiDe\KNDManager.cs" />
<Compile Include="KangNaiDe\MasterTcpClient.cs" />
<Compile Include="IO\AIManager.cs" />
<Compile Include="IO\AIOBOX\AIOAIManager.cs" />
<Compile Include="IO\AIOBOX\AIOBOXManager.cs" />
<Compile Include="IO\IOManager.cs" />
<Compile Include="IO\KangNaiDe\AITcpClient.cs" />
<Compile Include="IO\KangNaiDe\KNDAIManager.cs" />
<Compile Include="IO\KangNaiDe\KNDManager.cs" />
<Compile Include="IO\KangNaiDe\MasterTcpClient.cs" />
<Compile Include="PanasonicServo\ACCMDManager.cs" />
<Compile Include="PanasonicServo\ACServerManager.cs" />
<Compile Include="PanasonicServo\ACServerManager_Partial.cs" />
<Compile Include="ShuoKe\MeteringSignalBean.cs" />
<Compile Include="ShuoKe\ShuoKeController.cs" />
<Compile Include="store\LineMoveP.cs" />
<Compile Include="store\LineAlarm.cs">
<SubType>Code</SubType>
......
using Asa.IOModule;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace OnlineStore.DeviceLibrary
{
public abstract class AIManager
{
public bool NeedShow = false;
public static AIManager Instance = null;
public static void Init()
{
bool isAIOBox = ConfigAppSettings.GetIntValue(Setting_Init.UseAIOBOX).Equals(1);
if (isAIOBox)
{
Instance = new AIOAIManager();
}
else
{
Instance = new KNDAIManager();
}
}
public static double ConvertAI(double aiValue, double defaultValue)
{
double xishu = (double)StoreManager.Config.AI_ConvertPosition;
double result = Math.Round((aiValue - defaultValue) / xishu, 2);
return result;
}
public abstract void ConnectionIP(string ioIp);
public abstract void CloseConnect();
public abstract double GetAIValue(string ioiP,int index);
}
}
using Asa.IOModule;
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 AIOAIManager:AIManager
{
private object AILock = "";
private List<int> AIValList = null;
private int AILength = 4;
private Asa.IOModule.AIOBOX AIBox = null;
public override void ConnectionIP(string ioIp)
{
int autoMS = 150;
try
{
AIValList = new List<int>();
AIBox = new Asa.IOModule.AIOBOX();
AIBox.IP = ioIp;
// bool rtn = AIBox.AutoIP(ioIp);
AIBox.SetInput(Asa.IOModule.Box_Type.AI, AILength);
AIBox.SetOutput(Asa.IOModule.Box_Type.DO, 0);
AIBox.AutoReadInput(true, autoMS);
AIBox.AI_Changed_Event += Box_AI_Changed_Event;
LogUtil.debug("开始连接AI模块[" + ioIp + "][" + autoMS + "],尝试重连三次");
for (int i = 1; i <= 3; i++)
{
bool result = AIBox.Connect();
if (result)
{
LogUtil.info("第【" + i + "】次连接IO模块[" + ioIp + "][" + autoMS + "]成功:" + AIBox.ErrInfo);
Thread.Sleep(10);
break;
}
else
{
LogUtil.error("第【" + i + "】次连接IO模块[" + ioIp + "][" + autoMS + "]失败:" + AIBox.ErrInfo + "");
}
Thread.Sleep(10);
}
}
catch (Exception error)
{
LogUtil.error("连接IO模块[" + ioIp + "][" + autoMS + "]出错:" + error.ToString());
}
}
public override void CloseConnect()
{
try
{
if (AIBox != null)
{
AIBox.Close();
}
}
catch (Exception ex)
{
LogUtil.error("断开AI连接出错:" + ex.ToString());
}
}
private void Box_AI_Changed_Event(AIOBOX box, int[] val)
{
try
{
if (val != null && val.Length >= AILength)
{
lock (AILock)
{
AIValList = new List<int>();
AIValList.AddRange(val);
}
}
}
catch (Exception ex)
{
LogUtil.error("Box_AI_Changed_Event出错:" + ex.ToString());
}
}
public override double GetAIValue(string ioiP,int index)
{
if (AIValList != null && AIValList.Count > index)
{
return AIValList[index];
}
return -1;
}
//public override double ConvertAI(double aiValue, double defaultValue)
//{
// double xishu = (double)ConfigAppSettings.GetNumValue(Setting_Init.AI_ConvertPosition);
// double result = Math.Round((aiValue - defaultValue) / xishu, 2);
// return result;
//}
}
}
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System.Threading.Tasks;
using Asa.IOModule;
namespace OnlineStore.DeviceLibrary
{
public class AIOBOXManager : IOManager
{
//public static uint DefaultDICount = 16;
//public static uint DefaultDOCount = 16;
public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>();
public Dictionary<string, List<Box_Sta>> DIValueMap = new Dictionary<string, List<Box_Sta>>();
public Dictionary<string, List<Box_Sta>> DOValueMap = new Dictionary<string, List<Box_Sta>>();
private object DIMapLock = "";
private object DOMapLock = "";
private object DILock = "";
private object DOLock = "";
public void ConnectionIP(string ioIp)
{
AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp))
{
aioBox = AIOMap[ioIp];
if (null != aioBox)
{
aioBox.Close();
aioBox = null;
}
AIOMap.Remove(ioIp);
}
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.Remove(ioIp);
}
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
}
try
{
// Create new modbus master and add event functions
aioBox = new AIOBOX();
aioBox.IP = ioIp;
int DIMS = ConfigAppSettings.GetIntValue("DIMS");
if (DIMS < 20)
{
DIMS = 20;
}
int DOMS = ConfigAppSettings.GetIntValue("DOMS");
if (DOMS < 200)
{
DOMS = 200;
}
// bool rtn = aioBox.AutoIP(ioIp);
int DILength = StoreManager.Config.GetDILength(ioIp);
int DOLength = StoreManager.Config.GetDOLength(ioIp);
aioBox.SetInput(Asa.IOModule.Box_Type.DI, DILength);
aioBox.SetOutput(Asa.IOModule.Box_Type.DO, DOLength);
aioBox.AutoReadInput(true, DIMS);
aioBox.AutoReadOutput(true, DOMS);
aioBox.LogOut = true;
aioBox.DI_Changed_Event += AioBox_DI_Changed_Event; ;
aioBox.DO_Changed_Event += AioBox_DO_Changed_Event;
// aioBox.Log_Out_Event += AioBox_Log_Out_Event;
//aioBox.Log_RxTx_Event += AioBox_Log_RxTx_Event;
AIOMap.Add(ioIp, aioBox);
LogUtil.info("开始连接IO模块[" + ioIp + "][" + DIMS + "][" + DOMS + "],尝试重连三次");
for (int i = 1; i <= 3; i++)
{
bool result = aioBox.Connect();
if (result)
{
LogUtil.info("第【" + i + "】次连接IO模块【" + ioIp + "】成功:" + aioBox.ErrInfo);
Thread.Sleep(10);
//读取所有的DO
ReadAllDI(ioIp, 0);
break;
}
else
{
LogUtil.error("第【" + i + "】次连接IO模块【" + ioIp + "】失败:" + aioBox.ErrInfo + "");
}
Thread.Sleep(10);
}
}
catch (Exception error)
{
LogUtil.error(LOGGER, "连接IO模块[" + ioIp + "]出错:" + error.ToString());
}
}
private void AioBox_Reconnect_Event(AIOBOX box, int times, ref bool conn, Dictionary<string, string> dict)
{
conn = true;
string msg = "重连AIO块【" + box.IP + "】次数:" + times + "【" + box.ErrInfo + "】,连接信息如下\r\n";
foreach (string key in dict.Keys)
{
msg = msg + "\t" + "[" + key + "]=[" + dict[key] + "],";
}
LogUtil.error(msg);
}
private DateTime lastLogTime = DateTime.Now;
private void AioBox_Log_Out_Event(AIOBOX box, string[] s)
{
foreach (string str in s)
{
// LogUtil.AIOLog.Debug("[" + box.IP + "]" + str);
}
}
private void AioBox_DI_Changed_Event(AIOBOX box, Box_Sta[] sta)
{
try
{
UpdateAllDI(box.IP, sta);
}
catch (Exception ex)
{
LogUtil.error("AioBox_DI_Changed_Event出错:" + ex.ToString());
}
}
private void AioBox_DO_Changed_Event(AIOBOX box, Box_Sta[] sta)
{
try
{
UpdateAllDO(box.IP, sta);
}
catch (Exception ex)
{
LogUtil.error("AioBox_DO_Changed_Event出错:" + ex.ToString());
}
}
private void UpdateAllDI(string ip, Box_Sta[] sta)
{
if (sta != null && sta.Length >= StoreManager.Config.GetDILength(ip))
{
bool needUpdate = false;
List<Box_Sta> newList = new List<Box_Sta>();
newList.AddRange(sta);
List<Box_Sta> oldList = null;
DIValueMap.TryGetValue(ip, out oldList);
if (oldList == null || oldList.Count.Equals(newList.Count).Equals(false))
{
needUpdate = true;
}
else
{
for (int i = 0; i < newList.Count; i++)
{
if (!(oldList[i].Equals(newList[i])))
{
needUpdate = true;
break;
}
}
}
if (needUpdate)
{
lock (DILock)
{
if (DIValueMap.ContainsKey(ip))
{
DIValueMap.Remove(ip);
}
DIValueMap.Add(ip, newList);
}
}
}
}
private void UpdateAllDO(string ip, Box_Sta[] sta)
{
if (sta != null && sta.Length >= StoreManager.Config.GetDOLength(ip))
{
bool needUpdate = false;
List<Box_Sta> newList = new List<Box_Sta>();
newList.AddRange(sta);
List<Box_Sta> oldList = null;
DOValueMap.TryGetValue(ip, out oldList);
//string result = "UpdateAllDO ip[" + ip + "], sta :";
//for (int i = 0; i < newList.Count; i++)
//{
// result += newList[i] + ",";
//}
//LogUtil.info(result);
if (oldList == null || oldList.Count.Equals(newList.Count).Equals(false))
{
needUpdate = true;
}
else
{
for (int i = 0; i < newList.Count; i++)
{
if (!(oldList[i].Equals(newList[i])))
{
needUpdate = true;
break;
}
}
}
if (needUpdate)
{
lock (DOLock)
{
if (DOValueMap.ContainsKey(ip))
{
DOValueMap.Remove(ip);
}
DOValueMap.Add(ip, newList);
}
}
}
//else
//{
// if (sta == null)
// {
// LogUtil.error("UpdateAllDO ip[" + ip + "], sta=null");
// }
// else
// {
// LogUtil.error(" UpdateAllDO ip[" + ip + "], sta.Length=" + sta.Length);
// }
//}
}
public override void ConnectionIOList(List<string> DIONameList)
{
foreach (string ip in DIONameList)
{
ConnectionIP(ip);
}
}
//关闭所有的DO
public override void CloseAllDO()
{
foreach (AIOBOX aio in AIOMap.Values)
{
ushort length = StoreManager.Config.GetDOLength(aio.IP);
for (ushort i = 0; i < length; i++)
{
// ushort u = (ushort)(i + length);
// ushort u = (ushort)(i );
// Box_Addr addr = GetAddr(u);
aio.WriteDO(i, Box_Sta.Off);
}
}
}
public override void CloseAllConnection()
{
foreach (AIOBOX aio in AIOMap.Values)
{
aio.Close();
}
AIOMap.Clear();
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff)
{
try
{
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
// Box_Addr add = GetAddr(StartAddress);
for (int i = 1; i <= 3; i++)
{
bool result = aioBox.WriteDO(StartAddress, GetBox_Sta(onOff));
if (!result)
{
LogUtil.error("AIO WriteSingleDO [" + StartAddress + "] 第" + i + "次失败:" + aioBox.ErrInfo);
}
else
{
break;
}
}
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp);
}
}
catch (Exception ex)
{
LOGGER.Error("出错啦:" + ex.ToString());
}
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds)
{
try
{
AIOBOX aioBox = getAIO(ioIp);
Box_Sta currBox_Sta = GetBox_Sta(onOff);
if (aioBox != null)
{
// Box_Addr add = GetAddr(StartAddress);
aioBox.WriteDO(StartAddress, currBox_Sta);
//写入之后,等待指定间隔后回写
System.Timers.Timer mytimer = new System.Timers.Timer(mSeconds);
mytimer.Elapsed += (o1, e1) =>
{
try
{
aioBox.WriteDO(StartAddress, aioBox.ReverseStatus(currBox_Sta));
LogUtil.debug(LOGGER, "**********定时回写入 IO【" + ioIp + "," + StartAddress + ",值" + aioBox.ReverseStatus(currBox_Sta) + "】:");
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "**********定时回写入 出错:" + ex.StackTrace);
}
};
mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次;
mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask;
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp);
}
}
catch (Exception ex)
{
LogUtil.error("WriteSingleDO 出错:" + ioIp);
}
}
public override void ReadAllDI(string ioIp, byte slaveId)
{
try
{
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
Box_Sta[] allDi = aioBox.ReadDI(0, StoreManager.Config.GetDILength(ioIp));
UpdateAllDI(ioIp, allDi);
}
}
catch (Exception ex)
{
LogUtil.error("ReadAllDI出错:" + ioIp);
}
}
public override void ReadAllDO(string ioIp, byte slaveId)
{
try
{
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
// int startIndex = StoreManager.Config.GetDILength(ioIp);
Box_Sta[] allDO = aioBox.ReadDO(0, StoreManager.Config.GetDOLength(ioIp));
UpdateAllDO(ioIp, allDO);
}
}
catch (Exception ex)
{
LogUtil.error("ReadAllDO出错:" + ioIp);
}
}
public override IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
try
{
AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null)
{
Box_Sta sta = Box_Sta.Off;
// Box_Addr addr = GetAddr(StartAddress);
// int index = (int)StartAddress - (int)StoreManager.Config.GetDILength(ioIP);
if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress)
{
sta = DOValueMap[ioIP][StartAddress];
}
else
{ sta = aioBox.ReadDO(StartAddress); }
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
}
}
catch (Exception ex)
{
LogUtil.error("GetDOValue 出错:" + ex.ToString());
}
return value;
}
public override IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
try
{
AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null)
{
Box_Sta sta = Box_Sta.Off;
// Box_Addr addr = GetAddr(StartAddress);
int index = StartAddress;
if (DIValueMap.ContainsKey(ioIP) && DIValueMap[ioIP].Count > index)
{
sta = DIValueMap[ioIP][index];
}
else
{
sta = aioBox.ReadDI(StartAddress);
}
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
}
}
catch (Exception ex)
{
LogUtil.error("GetDIValue 出错:" + ex.ToString());
}
return value;
}
public override IO_VALUE GetIOValue(ConfigIO configIO)
{
IO_VALUE value = IO_VALUE.LOW;
try
{
if (configIO.ProType.Equals(ConfigItemType.DI))
{
return GetDIValue(configIO.IO_IP, configIO.SlaveID, configIO.GetIOAddr());
}
else if (configIO.ProType.Equals(ConfigItemType.DO))
{
return GetDOValue(configIO.IO_IP, configIO.SlaveID, configIO.GetIOAddr());
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, " GetIOValue 获取数据出错:" + ex.ToString());
}
return value;
}
//private Box_Addr GetAddr(ushort StartAddress)
//{
// return (Box_Addr)(StartAddress);
//}
private Box_Sta GetBox_Sta(IO_VALUE onOff)
{
if (onOff.Equals(IO_VALUE.HIGH))
{
return Box_Sta.On;
}
else
{
return Box_Sta.Off;
}
}
private AIOBOX getAIO(string ioIp)
{
AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp))
{
aioBox = AIOMap[ioIp];
}
return aioBox;
}
}
}
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace OnlineStore.DeviceLibrary
{
public abstract class IOManager
{
public static IOManager instance = null;
public abstract void ConnectionIOList(List<string> dIODeviceNameList);
#region KNDIO
public static void IOMove(string ioType, IO_VALUE ioValue)
{
if (StoreManager.Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.StoreDOList[ioType];
//DateTime time = DateTime.Now;
instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
//TimeSpan span = DateTime.Now - time;
//if (span.TotalMilliseconds > 100)
//{
// LogUtil.error("IOMove [" + ioType + "] ["+ioValue+"]耗时" + span.TotalMilliseconds);
//}
Thread.Sleep(60);
}
else
{
LogUtil.error("没有DO=" + ioType);
}
}
public static IO_VALUE IOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.LOW;
if (StoreManager.Config.StoreDIList.ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.StoreDIList[ioType];
ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
//UpdateDoValue(ioType, ioValue);
}
else if (StoreManager.Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.StoreDOList[ioType];
ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error("没有DO=" + ioType);
}
return ioValue;
}
public static IO_VALUE DOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.LOW;
if (StoreManager.Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.StoreDOList[ioType];
ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error("没有DO=" + ioType);
}
return ioValue;
}
#endregion
public static void Init()
{
bool isAIOBox = ConfigAppSettings.GetIntValue(Setting_Init.UseAIOBOX).Equals(1);
if (isAIOBox)
{
instance = new AIOBOXManager();
}
else
{
instance = new KNDManager();
}
}
public abstract void ReadAllDI(string deviceName, byte slaveId);
public abstract void ReadAllDO(string deviceName, byte slaveId);
public abstract void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value, int time);
public abstract void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value);
public abstract IO_VALUE GetDIValue(string deviceName, byte slaveID, ushort v);
public abstract IO_VALUE GetDOValue(string deviceName, byte slaveID, ushort v);
public abstract IO_VALUE GetIOValue(ConfigIO configIO);
public abstract void CloseAllDO();
public abstract void CloseAllConnection();
}
}
......@@ -15,22 +15,21 @@ namespace OnlineStore.DeviceLibrary
/// <summary>
/// 康奈德IO控制模块
/// </summary>
public class KNDAIManager
public class KNDAIManager : AIManager
{
public static ushort DefaultAILength = 8;
public static byte DefualtSlaveID = 255;
private static string AIStartAddress = "0258";
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static Dictionary<string, AITcpClient> mastMap = new Dictionary<string, AITcpClient>();
public static Dictionary<string, List<KNDAI>> AIValueMap = new Dictionary<string, List<KNDAI>>();
private static object AIMapLock = "";
public ushort DefaultAILength = 8;
public byte DefualtSlaveID = 255;
private string AIStartAddress = "0258";
public Dictionary<string, AITcpClient> mastMap = new Dictionary<string, AITcpClient>();
public Dictionary<string, List<KNDAI>> AIValueMap = new Dictionary<string, List<KNDAI>>();
private object AIMapLock = "";
public static System.Timers.Timer timer = null;
private static ushort port = 502;
public System.Timers.Timer timer = null;
private ushort port = 502;
//public static bool IsNeedReadAI = true;
public static void ConnectionIP(string ioIp)
public override void ConnectionIP(string ioIp)
{
if (timer == null)
{
......@@ -68,22 +67,19 @@ namespace OnlineStore.DeviceLibrary
MBmaster.OnException += new AITcpClient.ExceptionData(MBmaster_OnException);
MBmaster.autoConnectOfBreak = false;
mastMap.Add(ioIp, MBmaster);
if (MBmaster.ISConnection())
{
LogUtil.info(LOGGER, "连接AI模块[" + ioIp + "]成功");
Thread.Sleep(10);
WriteAIScope(ioIp, 1);
Thread.Sleep(10);
ReadAll(ioIp);
}
LogUtil.info("连接AI模块[" + ioIp + "]成功");
Thread.Sleep(10);
WriteAIScope(ioIp, 1);
Thread.Sleep(10);
ReadAll(ioIp);
}
catch (Exception error)
{
LogUtil.error(LOGGER, "连接AI模块[" + ioIp + "]出错:" + error.ToString());
LogUtil.error("连接AI模块[" + ioIp + "]出错:" + error.ToString());
}
}
private static void ReadAll(string ioIp)
private void ReadAll(string ioIp)
{
//读取所有的DO
ReadMultipleAI(ioIp, DefualtSlaveID, AIStartAddress, DefaultAILength);
......@@ -92,7 +88,7 @@ namespace OnlineStore.DeviceLibrary
/// <summary>
/// 判断Io模块是否连接
/// </summary>
public static bool IsConnection(string ip)
public bool IsConnection(string ip)
{
try
{
......@@ -113,14 +109,14 @@ namespace OnlineStore.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
LogUtil.error("出错啦:" + ex.ToString());
}
return false;
}
private static DateTime PreCheckTime = DateTime.Now;
private static bool isProcess = false;
public static bool NeedShow = false;
private static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
private DateTime PreCheckTime = DateTime.Now;
private bool isProcess = false;
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (isProcess)
{
......@@ -129,7 +125,7 @@ namespace OnlineStore.DeviceLibrary
try
{
isProcess = true;
bool IsNeedReadAI = StoreManager.Store.KNDIOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.HIGH) || NeedShow;
bool IsNeedReadAI = IOManager.IOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.HIGH) || NeedShow;
TimeSpan span = DateTime.Now - PreCheckTime;
List<string> list = new List<string>(mastMap.Keys);
foreach (string IP in list)
......@@ -148,7 +144,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (span.TotalSeconds > 3)
{
LogUtil.error(LOGGER, "AI模块" + IP + "当前没有连上,重连" + IP);
LogUtil.error("AI模块" + IP + "当前没有连上,重连" + IP);
ConnectionIP(IP);
PreCheckTime = DateTime.Now;
}
......@@ -156,18 +152,18 @@ namespace OnlineStore.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
LogUtil.error("出错啦:" + ex.ToString());
}
Thread.Sleep(2);
isProcess = false;
}
private static void WriteAIScope(string ioIp, int value)
private void WriteAIScope(string ioIp, int value)
{
// 0 表示 0 - 10V, 1 表示 0 - 5V
WriteAIScope(ioIp, DefualtSlaveID, "03EA", value);
}
private static void WriteAIScope(string ioIp, byte slaveId, string Adress, int value)
private void WriteAIScope(string ioIp, byte slaveId, string Adress, int value)
{
// 写 AI 模块采样范围,可以往寄存器里面写入 0 或 1。 0 表示 0 - 10V, 1 表示 0 - 5V。默
//认 0,写 AI 模块采样范围为 0 - 5V
......@@ -180,10 +176,10 @@ namespace OnlineStore.DeviceLibrary
}
else
{
LogUtil.error(LOGGER, "WriteAIScope出错没有连接AI模块:" + ioIp);
LogUtil.error("WriteAIScope出错没有连接AI模块:" + ioIp);
}
}
private static void ReadMultipleAI(string ioIp, byte slaveId, string StartAddress, int length)
private void ReadMultipleAI(string ioIp, byte slaveId, string StartAddress, int length)
{
ushort ID = 1;
AITcpClient MBmaster = null;
......@@ -194,10 +190,10 @@ namespace OnlineStore.DeviceLibrary
}
else
{
LogUtil.error(LOGGER, "ReadMultipleAI出错没有连接AI模块:" + ioIp);
LogUtil.error("ReadMultipleAI出错没有连接AI模块:" + ioIp);
}
}
public static void CloseAllConnection()
public override void CloseConnect()
{
List<AITcpClient> list = new List<AITcpClient>();
foreach (AITcpClient tcp in list)
......@@ -206,20 +202,14 @@ namespace OnlineStore.DeviceLibrary
}
mastMap.Clear();
}
public static double ConvertAI(double aiValue, double defaultValue)
{
double xishu = (double)ConfigAppSettings.GetNumValue(Setting_Init.AI_ConvertPosition);
double result = Math.Round((aiValue - defaultValue) / xishu, 2);
return result;
}
public static double GetAIValue(string ioiP, int index)
public override double GetAIValue(string ioiP, int index)
{
double aiValue = GetAIValue(ioiP, DefualtSlaveID, index - 1);
double aiValue = GetAIValue(ioiP, DefualtSlaveID, index - 1);
return Math.Round(aiValue, 2);
}
public static double GetAIValue(string ioIP, byte slaveId, int index)
public double GetAIValue(string ioIP, byte slaveId, int index)
{
double value = 0;
try
......@@ -243,7 +233,7 @@ namespace OnlineStore.DeviceLibrary
}
return value;
}
private static void ClearAIData(string ioIp)
private void ClearAIData(string ioIp)
{
byte[] datas = new byte[32];
for (int i = 0; i < datas.Length; i++)
......@@ -252,7 +242,7 @@ namespace OnlineStore.DeviceLibrary
}
SaveAIData(ioIp, 3, datas);
}
private static void SaveAIData(string ioIp, ushort ID, byte[] values)
private void SaveAIData(string ioIp, ushort ID, byte[] values)
{
try
{
......@@ -288,7 +278,7 @@ namespace OnlineStore.DeviceLibrary
}
try
{
if (StoreManager.Store != null && StoreManager.Store.KNDIOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.HIGH))
if (StoreManager.Store != null && IOManager.IOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.HIGH))
{
if (StoreManager.Config.AIDI1_Addr > 0 && StoreManager.Config.AIDI2_Addr > 0)
{ //每次上传后验证下
......@@ -325,18 +315,18 @@ namespace OnlineStore.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "SaveAIData出错:" + ex.ToString());
LogUtil.error("SaveAIData出错:" + ex.ToString());
}
}
private static float BitToFloat(string hexString)
private float BitToFloat(string hexString)
{
uint num = uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] floatVals = BitConverter.GetBytes(num);
float f = BitConverter.ToSingle(floatVals, 0);
return f;
}
private static void MBmaster_OnResponseData(string ioIp, ushort ID, byte function, byte[] values, byte[] reviceData)
private void MBmaster_OnResponseData(string ioIp, ushort ID, byte function, byte[] values, byte[] reviceData)
{
try
{
......@@ -397,10 +387,10 @@ namespace OnlineStore.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "处理接受数据出错:" + ex.ToString());
LogUtil.error("处理接受数据出错:" + ex.ToString());
}
}
private static void MBmaster_OnException(string ioIp, ushort id, byte function, byte exception, byte[] reviceData)
private void MBmaster_OnException(string ioIp, ushort id, byte function, byte exception, byte[] reviceData)
{
string exc = "Modbus says error: ";
switch (exception)
......@@ -418,7 +408,7 @@ namespace OnlineStore.DeviceLibrary
default:
break;
}
LOGGER.Error("接收数据出错:" + exc);
LogUtil.error("接收数据出错:" + exc);
}
}
......
......@@ -11,561 +11,581 @@ using System.Threading;
namespace OnlineStore.DeviceLibrary
{
{
/// <summary>
/// 康奈德IO控制模块
/// </summary>
public class KNDManager
{
public static ushort DIStartAddress = 200;
public static ushort DoStartAddress = 100;
public static ushort DefualtLength = 16;
private static byte DefualtSlaveID = 255;
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static Dictionary<string, MasterTcpClient> mastMap = new Dictionary<string, MasterTcpClient>();
public static Dictionary<string, List<KNDIO>> DIValueMap = new Dictionary<string, List<KNDIO>>();
public static Dictionary<string, List<KNDIO>> DOValueMap = new Dictionary<string, List<KNDIO>>();
private static object DIMapLock = "";
private static object DOMapLock = "";
public static System.Timers.Timer timer = null;
private static bool isWrite=false;
public static void ConnectionIP(string ioIp, ushort port)
{
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Interval = 300;
timer.AutoReset = true;
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
}
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
if (null != MBmaster)
{
MBmaster.disconnect();
MBmaster.Dispose();
MBmaster = null;
//lock (DIMapLock)
//{
// if (DIValueMap.ContainsKey(ioIp))
// {
// DIValueMap.Remove(ioIp);
// }
//}
lock (DOMapLock)
{
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
}
}
}
mastMap.Remove(ioIp);
}
try
{
// Create new modbus master and add event functions
MBmaster = new MasterTcpClient(ioIp, port);
MBmaster.OnResponseData += new MasterTcpClient.ResponseData(MBmaster_OnResponseData);
MBmaster.OnException += new MasterTcpClient.ExceptionData(MBmaster_OnException);
MBmaster.autoConnectOfBreak = false;
mastMap.Add(ioIp, MBmaster);
Thread.Sleep(10);
LogUtil.info("连接IO模块[" + ioIp + "]成功");
//读取所有的DO
ReadMultipleDO(ioIp, DefualtSlaveID, DoStartAddress, DefualtLength);
}
catch (Exception error)
{
LogUtil.error(LOGGER,"连接IO模块[" + ioIp + "]出错:"+error.ToString());
}
}
/// <summary>
/// 判断Io模块是否连接
/// </summary>
public static bool IsConnection(string ip)
{
try
{
List<string> list = new List<string>(mastMap.Keys);
foreach (string io in list)
{
//判断是否连接,如果没有连接自动重连
MasterTcpClient clinet = mastMap[io];
if (clinet.ISConnection())
{
return true;
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
} return false;
}
private static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
List<string> list = new List<string>(mastMap.Keys);
foreach (string io in list)
{
//判断是否连接,如果没有连接自动重连
MasterTcpClient clinet = mastMap[io];
if (!clinet.ISConnection())
public class KNDManager : IOManager
{
public static ushort DIStartAddress = 200;
public static ushort DoStartAddress = 100;
//public static ushort DefaultDILength = 16;
//public static ushort DefaultDOLength = 16;
private static byte DefualtSlaveID = 255;
public static readonly ILog LOGGER = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static Dictionary<string, MasterTcpClient> mastMap = new Dictionary<string, MasterTcpClient>();
public static Dictionary<string, List<KNDIO>> DIValueMap = new Dictionary<string, List<KNDIO>>();
public static Dictionary<string, List<KNDIO>> DOValueMap = new Dictionary<string, List<KNDIO>>();
private static object DIMapLock = "";
private static object DOMapLock = "";
public static System.Timers.Timer timer = null;
private static ushort port = 502;
public static void ConnectionIP(string ioIp)
{
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.AutoReset = true;
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
}
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
if (null != MBmaster)
{
MBmaster.disconnect();
MBmaster.Dispose();
MBmaster = null;
lock (DIMapLock)
{
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.Remove(ioIp);
}
}
lock (DOMapLock)
{
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
}
}
}
mastMap.Remove(ioIp);
}
try
{
// Create new modbus master and add event functions
MBmaster = new MasterTcpClient(ioIp, port);
MBmaster.OnResponseData += new MasterTcpClient.ResponseData(MBmaster_OnResponseData);
MBmaster.OnException += new MasterTcpClient.ExceptionData(MBmaster_OnException);
MBmaster.autoConnectOfBreak = false;
mastMap.Add(ioIp, MBmaster);
Thread.Sleep(10);
//读取所有的DO
ReadMultipleDO(ioIp, DefualtSlaveID, DoStartAddress, StoreManager.Config.GetDOLength(ioIp));
}
catch (Exception error)
{
LogUtil.error(LOGGER, "连接IO模块[" + ioIp + "]出错:" + error.ToString());
}
}
public override void ReadAllDI(string ioIp, byte slaveId)
{
ReadMultipleDI(ioIp, (byte)slaveId, (ushort)DIStartAddress, 16);
}
public override void ReadAllDO(string ioIp, byte slaveId)
{
ReadMultipleDO(ioIp, (byte)slaveId, (ushort)DoStartAddress, 16);
}
/// <summary>
/// 判断Io模块是否连接
/// </summary>
public static bool IsConnection(string ip)
{
try
{
List<string> list = new List<string>(mastMap.Keys);
foreach (string io in list)
{
if (io.Equals(ip))
{
ushort port = 502;
//判断是否连接,如果没有连接自动重连
MasterTcpClient clinet = mastMap[io];
if (clinet.ISConnection())
{
return true;
}
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
}
return false;
}
private static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
List<string> list = new List<string>(mastMap.Keys);
foreach (string io in list)
{
//判断是否连接,如果没有连接自动重连
MasterTcpClient clinet = mastMap[io];
if (clinet.ISConnection())
{
//ReadMultipleDI(io, DefualtSlaveID, DIStartAddress, DefualtLength);
}
else
{
ConnectionIP(io);
LogUtil.error(LOGGER, io + "当前没有连上,重连" + io);
ConnectionIP(io, port);
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:"+ex.ToString());
}
Thread.Sleep(1);
}
}
public static void ConnectionKND(List<string> DIONameList)
{
//端口号暂时使用固定的502;
ushort port = 502;
foreach (string ip in DIONameList)
{
ConnectionIP(ip, port);
}
}
public static void ConnectionKND(string ip)
{
//端口号暂时使用固定的502;
ushort port = 502;
ConnectionIP(ip, port);
}
public static void ReadMultipleDI(string ioIp, byte slaveId, ushort StartAddress, ushort length)
{
isWrite = true;
ushort ID = 2;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.ReadDiscreteInputs(ID, StartAddress, length, slaveId);
}
else
{
LogUtil.error(LOGGER, "ReadSingleDO出错没有连接IO模块:" + ioIp);
}
isWrite = false;
}
public static void ReadMultipleDO(string ioIp, byte slaveId, ushort StartAddress, ushort length)
{
isWrite = true;
ushort ID = 1;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.ReadCoils(ID, StartAddress, length, slaveId);
}
else
{
LogUtil.error(LOGGER,"ReadSingleDO出错没有连接IO模块:" + ioIp);
}
isWrite = false;
}
//关闭所有的DO
public static void CloseAllDO()
{
isWrite = true;
foreach (string key in mastMap.Keys)
{
byte[] data = new byte[] { 0,0};
WriteMultipleDO(key, DefualtSlaveID, DoStartAddress, DefualtLength, data);
}
isWrite = false;
}
public static void CloseAllConnection()
{
foreach (MasterTcpClient tcp in mastMap.Values)
{
tcp.disconnect();
}
mastMap.Clear();
}
public static void WriteMultipleDO(string ioIp, byte slaveId, ushort StartAddress, ushort length, byte[] bytes)
{
isWrite = true;
ushort ID = 6;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.WriteMultipleCoils(ID, StartAddress, length, bytes, slaveId);
}
else
{
LogUtil.error(LOGGER, "ReadSingleDO出错没有连接IO模块:" + ioIp);
}
isWrite = false;
}
public static void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff)
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
}
Thread.Sleep(1);
}
public override void ConnectionIOList(List<string> DIONameList)
{
foreach (string ip in DIONameList)
{
ConnectionIP(ip);
}
}
public static void ReadMultipleDI(string ioIp, byte slaveId, ushort StartAddress, ushort length)
{
ushort ID = 2;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.ReadDiscreteInputs(ID, StartAddress, length, slaveId);
}
else
{
LogUtil.error(LOGGER, "ReadMultipleDI出错 没有连接IO模块:" + ioIp);
}
}
public static void ReadMultipleDO(string ioIp, byte slaveId, ushort StartAddress, ushort length)
{
ushort ID = 1;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.ReadCoils(ID, StartAddress, length, slaveId);
}
else
{
LogUtil.error(LOGGER, "ReadMultipleDO出错 没有连接IO模块:" + ioIp);
}
}
//关闭所有的DO
public override void CloseAllDO()
{
foreach (string key in mastMap.Keys)
{
byte[] data = new byte[] { 0, 0 };
WriteMultipleDO(key, DefualtSlaveID, DoStartAddress, StoreManager.Config.GetDOLength(key), data);
}
}
public override void CloseAllConnection()
{
foreach (MasterTcpClient tcp in mastMap.Values)
{
tcp.disconnect();
}
mastMap.Clear();
timer.Stop();
timer = null;
}
public static void CloseAllDO(string ioIp, byte slaveId)
{
ushort length = StoreManager.Config.GetDOLength(ioIp);
byte[] bytes = new byte[length];
for (int i = 0; i < length; i++)
{
bytes[i] = 0;
}
WriteMultipleDO(ioIp, slaveId, DoStartAddress, length, bytes);
}
public static void WriteMultipleDO(string ioIp, byte slaveId, ushort StartAddress, ushort length, byte[] bytes)
{
ushort ID = 6;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.WriteMultipleCoils(ID, StartAddress, length, bytes, slaveId);
}
else
{
LogUtil.error(LOGGER, "WriteMultipleDO 出错 没有连接IO模块:" + ioIp);
}
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff)
{
ushort ID = 5;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.WriteSingleCoils(ID, StartAddress, onOff, slaveId);
KNDIO io = new KNDIO(ioIp, slaveId, StartAddress, onOff);
SaveDOValue(io, ioIp);
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO 出错没有连接IO模块:" + ioIp);
}
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds)
{
ushort ID = 5;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.WriteSingleCoils(ID, StartAddress, onOff, slaveId);
KNDIO io = new KNDIO(ioIp, slaveId, StartAddress, onOff);
SaveDOValue(io, ioIp);
//写入之后,等待指定间隔后回写
System.Timers.Timer mytimer = new System.Timers.Timer(mSeconds);
mytimer.Elapsed += (o1, e1) =>
{
try
{
IO_VALUE newValue = IO_VALUE.LOW;
if (onOff.Equals(IO_VALUE.LOW))
{
newValue = IO_VALUE.HIGH;
}
MBmaster.WriteSingleCoils(ID, StartAddress, newValue, slaveId);
KNDIO newIo = new KNDIO(ioIp, slaveId, StartAddress, newValue);
SaveDOValue(newIo, ioIp);
LogUtil.info(LOGGER, "**********定时回写入 IO【" + ioIp + "," + StartAddress + ",值" + onOff + "】:");
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "**********定时回写入 出错:" + ex.StackTrace);
}
};
mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次;
mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask;
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp);
}
}
private static void SaveDOValue(KNDIO io, string ioIp)
{
try
{
lock (DOMapLock)
{
if (!DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Add(ioIp, new List<KNDIO>());
DOValueMap[ioIp].Add(io);
}
else
{
List<KNDIO> ios = DOValueMap[ioIp];
List<KNDIO> list = (from m in ios where m.SlaveId.Equals(io.SlaveId) && m.IOAddress.Equals(io.IOAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
DOValueMap[ioIp].Remove(list[0]);
DOValueMap[ioIp].Add(io);
}
else
{
DOValueMap[ioIp].Add(io);
}
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "SaveDOValue出错:" + ex.ToString());
}
}
public override IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
if (DOValueMap.ContainsKey(ioIP))
{
List<KNDIO> allIo = new List<KNDIO>(DOValueMap[ioIP]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(slaveId) && m.IOAddress.Equals(StartAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
return value;
}
isWrite = true;
public override IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
if (DIValueMap.ContainsKey(ioIP))
{
List<KNDIO> allIo = new List<KNDIO>(DIValueMap[ioIP]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(slaveId) && m.IOAddress.Equals(StartAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
return value;
}
public override IO_VALUE GetIOValue(ConfigIO configIO)
{
IO_VALUE value = IO_VALUE.LOW;
try
{
ushort ID = 5;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
if (configIO.ProType.Equals(ConfigItemType.DI))
{
MBmaster = mastMap[ioIp];
bool result = MBmaster.WriteSingleCoils(ID, StartAddress, onOff, slaveId);
if (!result)
if (DIValueMap.ContainsKey(configIO.IO_IP))
{
LogUtil.error(LOGGER, "WriteSingleDO[" + ioIp + "][" + slaveId + "][" + StartAddress + "]失败,尝试重新写一次");
result = MBmaster.WriteSingleCoils(ID, StartAddress, onOff, slaveId);
List<KNDIO> allIo = new List<KNDIO>(DIValueMap[configIO.IO_IP]);
List<KNDIO> list = (from m in allIo where m.IOAddress.Equals(configIO.GetIOAddr()) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
if (!result)
}
else if (configIO.ProType.Equals(ConfigItemType.DO))
{
if (DOValueMap.ContainsKey(configIO.IO_IP))
{
LogUtil.error(LOGGER, "WriteSingleDO[" + ioIp + "][" + slaveId + "][" + StartAddress + "]失败,重新尝试仍失败");
List<KNDIO> allIo = new List<KNDIO>(DOValueMap[configIO.IO_IP]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(configIO.SlaveID) && m.IOAddress.Equals(configIO.GetIOAddr()) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
KNDIO io = new KNDIO(ioIp, slaveId, StartAddress, onOff);
SaveDOValue(io, ioIp);
}
else
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "获取数据出错:" + ex.ToString());
}
return value;
}
private static void SaveDIData(string ioIp, ushort ID, byte[] values)
{
try
{
ushort DILength = StoreManager.Config.GetDILength(ioIp);
string finalData = "";
if (values.Length == 2 && DILength.Equals(16))
{
string finalData0 = Convert.ToString(values[0], 2).PadLeft(8, '0');
string finalData1 = Convert.ToString(values[1], 2).PadLeft(8, '0');
finalData = finalData1 + finalData0;
}
else if (values.Length == 1 && DILength <= 8)
{
LogUtil.error(LOGGER, "WriteSingleDO[" + ioIp + "][" + slaveId + "][" + StartAddress + "]出错没有连接IO模块:" + ioIp);
finalData = Convert.ToString(values[0], 2).PadLeft(DILength, '0');
}
LOGGER.Debug("IO模块【" + ioIp + "】收到DI上传:【" + finalData + "】");
if (finalData.Length >= DILength)
{
List<KNDIO> kndList = new List<KNDIO>();
ushort index = (ushort)(DIStartAddress + DILength - 1);
foreach (char str in finalData)
{
KNDIO io = null;
if (str.Equals('1'))
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.HIGH);
}
else
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.LOW);
}
kndList.Add(io);
index--;
}
lock (DIMapLock)
{
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.Remove(ioIp);
}
DIValueMap.Add(ioIp, kndList);
}
}
}
catch (Exception ex)
{
LOGGER.Error("出错啦:" + ex.ToString());
LogUtil.error(LOGGER, "SaveDIData出错:" + ex.ToString());
//LOGGER.Error("处理接受数据出错:", ex);
}
isWrite = false;
}
public static void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds)
{
isWrite = true;
ushort ID = 5;
MasterTcpClient MBmaster = null;
if (mastMap.ContainsKey(ioIp))
{
MBmaster = mastMap[ioIp];
MBmaster.WriteSingleCoils(ID, StartAddress, onOff, slaveId);
KNDIO io = new KNDIO(ioIp, slaveId, StartAddress, onOff);
SaveDOValue(io, ioIp);
//写入之后,等待指定间隔后回写
System.Timers.Timer mytimer = new System.Timers.Timer(mSeconds);
mytimer.Elapsed += (o1, e1) =>
{
try
{
IO_VALUE newValue = IO_VALUE.LOW;
if (onOff.Equals(IO_VALUE.LOW))
{
newValue = IO_VALUE.HIGH;
}
MBmaster.WriteSingleCoils(ID, StartAddress, newValue, slaveId);
KNDIO newIo = new KNDIO(ioIp, slaveId, StartAddress, newValue);
SaveDOValue(newIo, ioIp);
LogUtil.debug(LOGGER, "**********定时回写入 IO【" + ioIp + "," + StartAddress + ",值" + onOff + "】:");
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "**********定时回写入 出错:" + ex.StackTrace);
}
};
mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次;
mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask;
}
else
{
LogUtil.error(LOGGER, "ReadSingleDO出错没有连接IO模块:" + ioIp);
}
isWrite = false;
}
private static void SaveDOValue(KNDIO io, string ioIp)
{
try
{
lock (DOMapLock)
{
if (!DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Add(ioIp, new List<KNDIO>());
DOValueMap[ioIp].Add(io);
}
else
{
List<KNDIO> ios = DOValueMap[ioIp];
List<KNDIO> list = (from m in ios where m.SlaveId.Equals(io.SlaveId) && m.IOAddress.Equals(io.IOAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
DOValueMap[ioIp].Remove(list[0]);
DOValueMap[ioIp].Add(io);
}
else
{
DOValueMap[ioIp].Add(io);
}
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER,"SaveDOValue出错:"+ex.ToString());
}
}
public static IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
if (DOValueMap.ContainsKey(ioIP))
{
List<KNDIO> allIo = new List<KNDIO>(DOValueMap[ioIP]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(slaveId) && m.IOAddress.Equals(StartAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
return value;
}
private static void SaveDOData(string ioIp, ushort ID, byte[] values)
{
ushort DoLength = StoreManager.Config.GetDOLength(ioIp);
string finalData = "";
if (values.Length == 2 && DoLength.Equals(16))
{
string finalData0 = Convert.ToString(values[0], 2).PadLeft(8, '0');
string finalData1 = Convert.ToString(values[1], 2).PadLeft(8, '0');
finalData = finalData1 + finalData0;
}
else if (values.Length == 1 && DoLength <= 8)
{
finalData = Convert.ToString(values[0], 2).PadLeft(DoLength, '0');
}
if (finalData.Length >= DoLength)
{
List<KNDIO> kndList = new List<KNDIO>();
ushort index = (ushort)(DoStartAddress + DoLength - 1);
foreach (char str in finalData)
{
KNDIO io = null;
if (str.Equals('1'))
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.HIGH);
}
else
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.LOW);
}
kndList.Add(io);
index--;
}
lock (DOMapLock)
{
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
}
DOValueMap.Add(ioIp, kndList);
}
}
public static IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
if (DIValueMap.ContainsKey(ioIP))
{
List<KNDIO> allIo = new List<KNDIO>(DIValueMap[ioIP]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(slaveId) && m.IOAddress.Equals(StartAddress) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
return value;
}
public static IO_VALUE GetIOValue(LoadCSVLibrary.ConfigIO configIO)
{
IO_VALUE value = IO_VALUE.LOW;
try
{
if (configIO.ProType.Equals(ConfigItemType.DI))
{
if (DIValueMap.ContainsKey(configIO.DeviceName))
{
List<KNDIO> allIo = new List<KNDIO>(DIValueMap[configIO.DeviceName]);
List<KNDIO> list = (from m in allIo where m.IOAddress.Equals(configIO.GetIOAddr()) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
}
else if (configIO.ProType.Equals(ConfigItemType.DO))
{
if (DOValueMap.ContainsKey(configIO.DeviceName))
{
List<KNDIO> allIo = new List<KNDIO>(DOValueMap[configIO.DeviceName]);
List<KNDIO> list = (from m in allIo where m.SlaveId.Equals(configIO.SlaveID) && m.IOAddress.Equals(configIO.GetIOAddr()) select m).ToList<KNDIO>();
if (list.Count > 0)
{
value = list[0].IoValue;
}
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "获取数据出错:" + ex.ToString());
}
return value;
}
private static void SaveDIData(string ioIp, ushort ID, byte[] values)
{
try
{
if (values.Length == 2)
{
string finalData0 = Convert.ToString(values[0], 2).PadLeft(8, '0');
string finalData1 = Convert.ToString(values[1], 2).PadLeft(8, '0');
string finalData = finalData1 + finalData0;
List<KNDIO> kndList = new List<KNDIO>();
ushort index = (ushort)(DIStartAddress + DefualtLength - 1);
foreach (char str in finalData)
{
KNDIO io = null;
if (str.Equals('1'))
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.HIGH);
}
else
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.LOW);
}
kndList.Add(io);
index--;
}
lock (DIMapLock)
{
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.Remove(ioIp);
}
DIValueMap.Add(ioIp, kndList);
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "SaveDIData出错:" + ex.ToString());
//LOGGER.Error("处理接受数据出错:", ex);
}
}
}
// ------------------------------------------------------------------------
// Event for response data
// ------------------------------------------------------------------------
private static void MBmaster_OnResponseData(string ioIp, ushort ID, byte function, byte[] values, byte[] reviceData)
{
try
{
if (ioIp.IndexOf(":") > 0)
{
ioIp = ioIp.Substring(0, ioIp.IndexOf(":"));
}
string reviceMsg = "";
foreach (byte data in reviceData)
{
reviceMsg = reviceMsg + " " + data;
if (reviceMsg.Length > 200)
{
break;
}
}
if (ID == 0xFF)
{
return;
}
// ------------------------------------------------------------------------
// Identify requested data
ushort Func = ID;
private static void SaveDOData(string ioIp, ushort ID, byte[] values)
{
if (values.Length == 2)
{
string finalData0 = Convert.ToString(values[0], 2).PadLeft(8, '0');
string finalData1 = Convert.ToString(values[1], 2).PadLeft(8, '0');
string finalData = finalData1 + finalData0;
List<KNDIO> kndList = new List<KNDIO>();
ushort index = (ushort)(DoStartAddress + DefualtLength - 1);
foreach (char str in finalData)
{
KNDIO io = null;
if (str.Equals('1'))
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.HIGH);
}
else
{
io = new KNDIO(ioIp, (byte)ID, index, IO_VALUE.LOW);
}
kndList.Add(io);
index--;
}
lock (DOMapLock)
{
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
}
DOValueMap.Add(ioIp, kndList);
}
}
}
// ------------------------------------------------------------------------
// Event for response data
// ------------------------------------------------------------------------
private static void MBmaster_OnResponseData(string ioIp, ushort ID, byte function, byte[] values, byte[] reviceData)
{
try
{
if (ioIp.IndexOf(":") > 0)
{
ioIp = ioIp.Substring(0, ioIp.IndexOf(":"));
}
string reviceMsg = "";
foreach (byte data in reviceData)
{
reviceMsg = reviceMsg + " " + data;
if (reviceMsg.Length > 200)
{
break;
}
}
if (ID == 0xFF)
{
return;
}
// ------------------------------------------------------------------------
// Identify requested data
ushort Func = ID;
if (Func == 0 && reviceData.Length > 8)
{
Func = reviceData[7];
}
byte SlaveId = 0xFF;
if (reviceData.Length >= 7)
{
SlaveId = reviceData[6];
}
switch (Func)
{
case 1:
LOGGER.Info("Read coils end:【" + reviceMsg + "】 ");
SaveDOData(ioIp, SlaveId, values);
break;
case 2:
//LOGGER.Info("Read discrete inputs end:【" + reviceMsg + "】 ");
SaveDIData(ioIp, SlaveId, values);
break;
case 3:
//LOGGER.Info("读入(多个)寄存器完成 end:【" + reviceMsg + "】 ");
break;
case 4:
//LOGGER.Info("读入(多个)寄存器完成 end:【" + reviceMsg + "】 ");
break;
case 5:
//LOGGER.Info("Write single coil:【" + reviceMsg + "】 ");
break;
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "处理接受数据出错:" + ex.ToString());
//LOGGER.Error("处理接受数据出错:", ex);
}
}
if (Func == 0 && reviceData.Length > 8)
{
Func = reviceData[7];
}
byte SlaveId = 0xFF;
if (reviceData.Length >= 7)
{
SlaveId = reviceData[6];
}
switch (Func)
{
case 1:
LOGGER.Info("Read coils end:【" + reviceMsg + "】 ");
SaveDOData(ioIp, SlaveId, values);
break;
case 2:
//LOGGER.Info("Read discrete inputs end:【" + reviceMsg + "】 ");
SaveDIData(ioIp, SlaveId, values);
break;
case 3:
//LOGGER.Info("读入(多个)寄存器完成 end:【" + reviceMsg + "】 ");
break;
case 4:
//LOGGER.Info("读入(多个)寄存器完成 end:【" + reviceMsg + "】 ");
break;
case 5:
//LOGGER.Info("Write single coil:【" + reviceMsg + "】 ");
break;
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "处理接受数据出错:" + ex.ToString());
//LOGGER.Error("处理接受数据出错:", ex);
}
}
// ------------------------------------------------------------------------
// Modbus TCP slave exception
// ------------------------------------------------------------------------
private static void MBmaster_OnException(string ioIp, ushort id, byte function, byte exception, byte[] reviceData)
{
string exc = "Modbus says error: ";
switch (exception)
{
case MasterTcpClient.excIllegalFunction: exc += "Illegal function!"; break;
case MasterTcpClient.excIllegalDataAdr: exc += "Illegal data adress!"; break;
case MasterTcpClient.excIllegalDataVal: exc += "Illegal data value!"; break;
case MasterTcpClient.excSlaveDeviceFailure: exc += "Slave device failure!"; break;
case MasterTcpClient.excAck: exc += "Acknoledge!"; break;
case MasterTcpClient.excSlaveIsBusy: exc += "Slave is busy!"; break;
case MasterTcpClient.excGatePathUnavailable: exc += "Gateway path unavailbale!"; break;
case MasterTcpClient.excExceptionTimeout: exc += "Slave timed out!"; break;
case MasterTcpClient.excExceptionConnectionLost: exc += "Connection is lost!"; break;
case MasterTcpClient.excExceptionNotConnected: exc += "Not connected!"; break;
default:
break;
}
LOGGER.Error("接收数据出错:"+ exc);
//MessageBox.Show(exc, "Modbus slave exception");
}
}
public class KNDIO
// ------------------------------------------------------------------------
// Modbus TCP slave exception
// ------------------------------------------------------------------------
private static void MBmaster_OnException(string ioIp, ushort id, byte function, byte exception, byte[] reviceData)
{
string exc = "Modbus says error: ";
switch (exception)
{
case MasterTcpClient.excIllegalFunction: exc += "Illegal function!"; break;
case MasterTcpClient.excIllegalDataAdr: exc += "Illegal data adress!"; break;
case MasterTcpClient.excIllegalDataVal: exc += "Illegal data value!"; break;
case MasterTcpClient.excSlaveDeviceFailure: exc += "Slave device failure!"; break;
case MasterTcpClient.excAck: exc += "Acknoledge!"; break;
case MasterTcpClient.excSlaveIsBusy: exc += "Slave is busy!"; break;
case MasterTcpClient.excGatePathUnavailable: exc += "Gateway path unavailbale!"; break;
case MasterTcpClient.excExceptionTimeout: exc += "Slave timed out!"; break;
case MasterTcpClient.excExceptionConnectionLost: exc += "Connection is lost!"; break;
case MasterTcpClient.excExceptionNotConnected: exc += "Not connected!"; break;
default:
break;
}
LOGGER.Error("接收数据出错:" + exc);
//MessageBox.Show(exc, "Modbus slave exception");
}
}
public class KNDIO
{
public KNDIO(string ioIp, byte ID, ushort index, IO_VALUE o_VALUE)
......
......@@ -13,7 +13,7 @@ using OnlineStore.LoadCSVLibrary;
namespace OnlineStore.DeviceLibrary
{
public class MasterTcpClient
{
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
......@@ -70,7 +70,7 @@ namespace OnlineStore.DeviceLibrary
// ------------------------------------------------------------------------
/// <summary>Response data event. This event is called when new data arrives</summary>
public delegate void ResponseData(string ip, ushort id, byte function, byte[] data,byte[] reviceData);
public delegate void ResponseData(string ip, ushort id, byte function, byte[] data, byte[] reviceData);
/// <summary>Response data event. This event is called when new data arrives</summary>
public event ResponseData OnResponseData;
/// <summary>Exception data event. This event is called when the data is incorrect</summary>
......@@ -84,25 +84,25 @@ namespace OnlineStore.DeviceLibrary
public bool autoConnectOfBreak
{
get { return _autoConnectOfBreak; }
set { _autoConnectOfBreak = value; }
}
set { _autoConnectOfBreak = value; }
}
public static ushort timeout
{
get { return _timeout; }
set { _timeout = value; }
}
public ushort refresh
{
get { return _refresh; }
set { _refresh = value; }
}
public bool connected
{
get { return _connected; }
}
public MasterTcpClient()
{
}
......@@ -126,7 +126,7 @@ namespace OnlineStore.DeviceLibrary
socketClient.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, _timeout);
socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _timeout);
socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
}
else
{
......@@ -166,12 +166,12 @@ namespace OnlineStore.DeviceLibrary
try
{
//socketClient.BeginReceive(tcpSocketReviceBuffer, 0, tcpSocketReviceBuffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), socketClient);
ReviceDataProcess();
ReviceDataProcess();
Thread.Sleep(10);
}
catch (Exception ex)
{
LOGGER.Error("IO模块["+IP+"]出错:" + ex.ToString());
LOGGER.Error("IO模块[" + IP + "]出错:" + ex.ToString());
}
}
......@@ -198,15 +198,16 @@ namespace OnlineStore.DeviceLibrary
byte dataLength = rdata[lengthIndex];
int allLength = lengthIndex + 1 + dataLength;
int currStartIndex = 0;
if (rdata.Length > allLength)
{
try
//LogUtil.info(clientipe.ToString() + "收到数据(需要分包):" + str);
int currStartIndex = 0;
for (int i = 0; i < 100; i++)
{
//LogUtil.info(clientipe.ToString() + "收到数据(需要分包):" + str);
try
{
for (int i = 0; i < 100; i++)
{
if (rdata.Length < currStartIndex + lengthIndex)
{
LogUtil.error(clientipe.ToString() + "收到数据:" + str + "分包出错 [" + currStartIndex + "]");
......@@ -228,11 +229,12 @@ namespace OnlineStore.DeviceLibrary
}
currStartIndex = currStartIndex + allLength;
}
catch (Exception ex)
{
LogUtil.error(clientipe.ToString() + "收到数据:" + str + "分包出错 [" + currStartIndex + "]:" + ex.ToString());
}
}
catch (Exception ex)
{
LogUtil.error(clientipe.ToString() + "收到数据:" + str + "分包出错 [" + currStartIndex + "]:" + ex.ToString());
}
}
else
{
......@@ -247,10 +249,7 @@ namespace OnlineStore.DeviceLibrary
private void DataProcess(string clientIp, ushort id, byte function, byte[] rdata)
{
byte[] data;
if (rdata.Length <= 9)
{
return;
}
if ((function >= fctWriteSingleCoil) && (function != fctReadWriteMultipleRegister))
{
data = new byte[2];
......@@ -274,11 +273,11 @@ namespace OnlineStore.DeviceLibrary
// Response data is regular data
else if (OnResponseData != null)
{ //收到的数据打印出来
OnResponseData(clientIp, id, function, data, rdata);
}
}
private byte[] Receive()
{
try
......@@ -287,10 +286,10 @@ namespace OnlineStore.DeviceLibrary
{
return null;
}
int size = socketClient.Available;
byte[] rData = new byte[size];
socketClient.Receive(rData, size, SocketFlags.None);
byte[] rData = new byte[size];
socketClient.Receive(rData, size, SocketFlags.None);
return rData;
}
......@@ -305,8 +304,8 @@ namespace OnlineStore.DeviceLibrary
return null;
}
}
}
// ------------------------------------------------------------------------
/// <summary>Stop connection to slave.</summary>
public void disconnect()
......@@ -341,7 +340,7 @@ namespace OnlineStore.DeviceLibrary
socketClient.Close();
}
socketClient = null;
}
}
}
internal void CallException(ushort id, byte function, byte exception, byte[] rdata)
......@@ -363,33 +362,33 @@ namespace OnlineStore.DeviceLibrary
OnException(socketClient.RemoteEndPoint.AddressFamily.ToString(), id, function, exception, rdata);
}
}
public void ReadCoils(ushort id, ushort startAddress, ushort numInputs, byte SlaveID)
{
WriteAsyncData(CreateReadHeader(id, startAddress, numInputs, fctReadCoil, SlaveID), id);
}
}
public void ReadDiscreteInputs(ushort id, ushort startAddress, ushort numInputs, byte SlaveID)
{
WriteAsyncData(CreateReadHeader(id, startAddress, numInputs, fctReadDiscreteInputs, SlaveID), id);
}
}
public void ReadHoldingRegister(ushort id, ushort startAddress, ushort numInputs, byte SlaveID)
{
WriteAsyncData(CreateReadHeader(id, startAddress, numInputs, fctReadHoldingRegister, SlaveID), id);
}
}
public void ReadInputRegister(ushort id, ushort startAddress, ushort numInputs, byte SlaveID)
{
WriteAsyncData(CreateReadHeader(id, startAddress, numInputs, fctReadInputRegister, SlaveID), id);
}
public bool WriteSingleCoils(ushort id, ushort startAddress, IO_VALUE ioValue, byte SlaveID)
public void WriteSingleCoils(ushort id, ushort startAddress, IO_VALUE ioValue, byte SlaveID)
{
byte[] data;
bool OnOff = ioValue.Equals(IO_VALUE.HIGH);
data = CreateWriteHeader(id, startAddress, 1, 1, fctWriteSingleCoil, SlaveID);
if (OnOff == true) data[10] = 255;
else data[10] = 0;
return WriteAsyncData(data, id);
WriteAsyncData(data, id);
}
public void WriteMultipleCoils(ushort id, ushort startAddress, ushort numBits, byte[] values, byte SlaveID)
{
byte numBytes = Convert.ToByte(values.Length);
......@@ -397,8 +396,8 @@ namespace OnlineStore.DeviceLibrary
data = CreateWriteHeader(id, startAddress, numBits, (byte)(numBytes + 2), fctWriteMultipleCoils, SlaveID);
Array.Copy(values, 0, data, 13, numBytes);
WriteAsyncData(data, id);
}
}
public void WriteSingleRegister(ushort id, ushort startAddress, byte[] values, byte SlaveID)
{
byte[] data;
......@@ -406,8 +405,8 @@ namespace OnlineStore.DeviceLibrary
data[10] = values[0];
data[11] = values[1];
WriteAsyncData(data, id);
}
}
public void WriteMultipleRegister(ushort id, ushort startAddress, byte[] values, byte SlaveID)
{
ushort numBytes = Convert.ToUInt16(values.Length);
......@@ -417,8 +416,8 @@ namespace OnlineStore.DeviceLibrary
data = CreateWriteHeader(id, startAddress, Convert.ToUInt16(numBytes / 2), Convert.ToUInt16(numBytes + 2), fctWriteMultipleRegister, SlaveID);
Array.Copy(values, 0, data, 13, values.Length);
WriteAsyncData(data, id);
}
}
public void ReadWriteMultipleRegister(ushort id, ushort startReadAddress, ushort numInputs, ushort startWriteAddress, byte SlaveID, byte[] values)
{
ushort numBytes = Convert.ToUInt16(values.Length);
......@@ -430,7 +429,7 @@ namespace OnlineStore.DeviceLibrary
WriteAsyncData(data, id);
}
// ------------------------------------------------------------------------
// Create modbus header for read action
private byte[] CreateReadHeader(ushort id, ushort startAddress, ushort length, byte function, byte SlaveID)
......@@ -512,12 +511,12 @@ namespace OnlineStore.DeviceLibrary
// ------------------------------------------------------------------------
// Write asynchronous data
private bool WriteAsyncData(byte[] write_data, ushort id)
private void WriteAsyncData(byte[] write_data, ushort id)
{
if (socketClient == null)
{
LOGGER.Error("MasterTcpClient发送数据时发现socketClient=null");
return false ;
LOGGER.Error("发送数据时发现socketClient=null");
return;
}
IPEndPoint clientipe = (IPEndPoint)socketClient.RemoteEndPoint;
if ((socketClient != null) && (socketClient.Connected))
......@@ -528,14 +527,13 @@ namespace OnlineStore.DeviceLibrary
string str = "";
foreach (byte by in write_data)
{
str = str +" "+ by;
str = str + " " + by;
}
//LogUtil.info( clientipe.ToString()+"发送数据:" + str);
socketClient.BeginSend(write_data, 0, write_data.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
//socketClient.BeginReceive(tcpSocketReviceBuffer, 0, tcpSocketReviceBuffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), socketClient);
ReviceDataProcess();
return true;
}
catch (SystemException error)
{
......@@ -544,9 +542,8 @@ namespace OnlineStore.DeviceLibrary
}
}
else CallException(id, write_data[7], excExceptionConnectionLost, tcpSocketReviceBuffer);
return false;
}
// ------------------------------------------------------------------------
// Write asynchronous data acknowledge
private void OnSend(System.IAsyncResult result)
......@@ -563,7 +560,8 @@ namespace OnlineStore.DeviceLibrary
return;
}
IPEndPoint clientipe = (IPEndPoint)socketClient.RemoteEndPoint;
if (result.IsCompleted == false) {
if (result.IsCompleted == false)
{
CallException(0xFF, 0xFF, excExceptionConnectionLost, tcpSocketReviceBuffer);
}
......@@ -590,7 +588,7 @@ namespace OnlineStore.DeviceLibrary
if (function > excExceptionOffset)
{
function -= excExceptionOffset;
CallException(id, function, tcpSocketReviceBuffer[8],tcpSocketReviceBuffer);
CallException(id, function, tcpSocketReviceBuffer[8], tcpSocketReviceBuffer);
}
// ------------------------------------------------------------
// Response data is regular data
......@@ -605,13 +603,13 @@ namespace OnlineStore.DeviceLibrary
break;
}
}
// LogUtil.info( clientipe.ToString()+"收到数据:" + str);
// LogUtil.info( clientipe.ToString()+"收到数据:" + str);
OnResponseData(clientipe.ToString(), id, function, data, tcpSocketReviceBuffer);
}
}
internal bool ISConnection()
{
{
if (socketClient == null)
{
return false;
......
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace OnlineStore.DeviceLibrary
{
/// <summary>
/// 压紧机构计量检测信号处理
/// </summary>
public class MeteringSignal
{
public static int ComAxisChangeValue = ConfigAppSettings.GetIntValue(Setting_Init.ComAxisChangeValue);
/// <summary>
/// 信号变化次数
/// </summary>
public static int SignalChangeCount=0;
public static int TragetChangeCount = 0;
public static IO_VALUE PreSignalValue = IO_VALUE.LOW;
private static System.Timers.Timer timer = null;
public static void StartCheck(int targetPositon, int currPosition)
{
int chazhi = Math.Abs(targetPositon - currPosition);
int count = chazhi / ComAxisChangeValue;
if (count > 0 && chazhi > ComAxisChangeValue)
{
StartCheck(count);
}
}
private static void StartCheck(int targetCount)
{
TragetChangeCount = targetCount;
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Interval = 50;
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
timer.Enabled = false;
}
LogUtil.debug("开始压紧轴计量检测,预计变化" + TragetChangeCount + "次");
IsInProcess = false;
PreSignalValue = IO_VALUE.LOW;
SignalChangeCount = 0;
timer.Start();
}
public static void StopCheck()
{
if(timer==null)
{ return; }
timer.Stop();
}
private static bool IsInProcess = false;
protected static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (IsInProcess) { return; }
IsInProcess = true;
IO_VALUE value = StoreManager.Store.KNDIOValue(IO_Type.CompressAxis_Check);
if (value.Equals(IO_VALUE.HIGH) && PreSignalValue.Equals(IO_VALUE.LOW))
{
SignalChangeCount++;
LogUtil.debug("检测到信号变化,已经变化" + SignalChangeCount + "次");
}
PreSignalValue = value;
if (TragetChangeCount <= SignalChangeCount)
{
timer.Stop();
}
IsInProcess = false;
}
}
}
using log4net;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
namespace OnlineStore.DeviceLibrary
{
/// <summary>
/// 硕科控制模块代码
/// </summary>
public class ShuoKeControls
{
public static readonly ILog LOGGER = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static AcSerialBean bean = null;
public static bool isRun = false;
private static Dictionary<int, ShuoKeInfo> shuokeMap = new Dictionary<int, ShuoKeInfo>();
public static string PortName = "";
private static int SleepMS = 50;
private static int DReviceLength = 5;
#region 串口操作
public static bool ResertInitPort(string comPortName, int baudRate, int tparity, int dataBits, StopBits stopBits)
{
PortName = comPortName;
if (isRun)
{
ClosePort();
}
return InitPort(comPortName, baudRate, tparity, dataBits, stopBits);
}
public static bool InitPort(string comPortName, int baudRate, int tparity, int dataBits, StopBits stopBits)
{
if (isRun)
{
return true;
}
try
{
PortName = comPortName;
Parity parity = (Parity)tparity;
bean = new AcSerialBean(comPortName, baudRate, parity, 8, stopBits);
bool result = bean.openPort();
if (!result)
{
return false;
}
//bean.DataReceived += DataReceived;
isRun = true;
}
catch (Exception ex)
{
isRun = false;
LogUtil.error(LOGGER, "打开步进控制器串口失败:" + ex.ToString());
return false;
}
return true;
}
public static void ClosePort()
{
isRun = false;
if (bean == null)
{
return;
}
bean.closePort();
LogUtil.info(LOGGER, "关闭步进控制器串口完成");
}
/// <summary>
/// 发送数据并获取返回值
/// </summary>
/// <param name="data">发送的数据</param>
/// <param name="outTime">超时时间</param>
/// <returns>返回值的长度</returns>
public static byte[] SendCommand( byte[] data, int outTime, int reviceLength)
{
if (outTime <= 0)
{
outTime = 30;
}
if (outTime > 80)
{
outTime = 80;
}
byte[] returnData = null;
try
{
if (data == null)
{
return returnData;
}
string strSend = "";
for (int i = 0; i < data.Length; i++)
{
strSend += string.Format("{0:X2} ", data[i]);
}
if (strSend.Equals(""))
{
return returnData;
}
LogUtil.debug("串口" + PortName + " 写入数据:" + strSend + "");
if (bean == null)
{
LogUtil.debug(" 试图向未打开串口【" + PortName + "】写入数据:" + strSend + "。");
}
else
{
bean.SendCommand(data, ref returnData, outTime, reviceLength);
}
}
catch (Exception ex)
{
LogUtil.info(ex.ToString());
}
return returnData;
}
private static void DataReceived(string portName, object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
string strSend = "";
for (int i = 0; i < bits.Length; i++)
{
strSend += string.Format("{0:X2} ", bits[i]);
}
if (strSend.Equals(""))
{
return;
}
//校验
ushort pChecksum = 0;
AcSerialBean.CalculateCRC(bits, bits.Length - 2, out pChecksum);
string checkStr = Convert.ToString(pChecksum, 16);
byte[] checkByte = AcSerialBean.StringToByte(checkStr);
if (checkByte.Length == 1)
{
if (!bits[bits.Length - 2].Equals(checkByte[0]))
{
bean.clearInBuffer();
LogUtil.info(LOGGER, " 【" + portName + "】 收到数据【" + strSend + "】,校验错误");
return;
}
}
else
{
if (!bits[bits.Length - 1].Equals(checkByte[0]) || (!bits[bits.Length - 2].Equals(checkByte[1])))
{
bean.clearInBuffer();
LogUtil.info(LOGGER, " 【" + portName + "】 收到数据【" + strSend + "】,校验错误");
return;
}
}
LogUtil.debug(LOGGER, " 【" + portName + "】 收到数据【" + strSend + "】");
int slvAddr = (int)bits[0];
byte cmd = bits[1];
//查询状态
if (cmd.Equals(ShuoKeCMD.SearchMoveStatus))
{
ShuoKeInfo info = DataToStatus(bits);
}
else if (cmd.Equals(ShuoKeCMD.GetAbsPosition))
{
int position = DataToPosition(bits);
}
}
private static bool CheckByte(byte[] bits)
{
string strSend = "";
if (bits == null)
{
return false;
}
for (int i = 0; i < bits.Length; i++)
{
strSend += string.Format("{0:X2} ", bits[i]);
}
//校验
ushort pChecksum = 0;
AcSerialBean.CalculateCRC(bits, bits.Length - 2, out pChecksum);
string checkStr = Convert.ToString(pChecksum, 16);
byte[] checkByte = AcSerialBean.StringToByte(checkStr);
if (checkByte.Length == 1)
{
if (!bits[bits.Length - 2].Equals(checkByte[0]))
{
bean.clearInBuffer();
LogUtil.info(LOGGER, "【" + PortName + "】收到数据【" + strSend + "】校验错误");
return false ;
}
}
else
{
if (!bits[bits.Length - 1].Equals(checkByte[0]) || (!bits[bits.Length - 2].Equals(checkByte[1])))
{
bean.clearInBuffer();
LogUtil.info(LOGGER, "【" + PortName + "】收到数据【" + strSend + "】校验错误");
return false ;
}
}return true;
}
private static int DataToPosition(byte[] bits)
{
int absValue = -1;
if (!CheckByte(bits))
{
return absValue;
}
if (bits.Length >= 7)
{
int slvAddr = (int)bits[0];
byte[] positionData = new byte[4];
Array.Copy(bits, 3, positionData, 0, 4);
string a = AcSerialBean.byteToHexStr(positionData);
absValue = Convert.ToInt32(a, 16);
LogUtil.debug(LOGGER, "收到驱动器【" + slvAddr + "】绝对位置【" + absValue + "】");
if (shuokeMap.ContainsKey(slvAddr))
{
shuokeMap[slvAddr].LastPosition = absValue;
}
else
{
ShuoKeInfo info = new ShuoKeInfo(slvAddr, absValue);
shuokeMap.Add(slvAddr, info);
}
}
return absValue;
}
private static ShuoKeInfo DataToStatus(byte[] bits)
{
ShuoKeInfo info = new ShuoKeInfo(-1, -1);
if (!CheckByte(bits))
{
return info;
}
if (bits.Length >= 8)
{
//[数据1]:1表示运动中,0表示停止
//[数据2]:LL-左限位IO状态 1表示有效 0表示无效
//[数据3]:O-原点IO状态 1表示有效 0表示无效,,=1表示原点灭,=0表示当前原点亮
// [数据4]:RL-右限位IO状态 1表示有效 0表示无效
//[数据5]:EN-使能IO状态 1表示有效 0表示无效
int slvAddr = (int)bits[0];
byte cmd = bits[1];
int isInMove = bits[3];
int isLLimit = bits[4];
int isOrg = bits[5];
int isRLimit = bits[6];
int isEn = bits[7];
info = new ShuoKeInfo(isInMove, slvAddr, isLLimit, isOrg, isRLimit, isEn);
try
{
if (shuokeMap.ContainsKey(slvAddr))
{
info.LastPosition = shuokeMap[slvAddr].LastPosition;
shuokeMap.Remove(slvAddr);
}
shuokeMap.Add(slvAddr, info);
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "记录状态出错:" + ex.ToString());
}
LogUtil.debug(LOGGER, "收到驱动器【" + slvAddr + "】运动状态:运动【" + isInMove + "】左限位【" + isLLimit + "】右限位【" + isRLimit + "】原点【" + isOrg + "】使能【" + isEn + "】");
}
return info;
}
public static int GetLastPosition(int slvAddr)
{
if (shuokeMap.ContainsKey(slvAddr))
{
ShuoKeInfo info = shuokeMap[slvAddr];
return info.LastPosition;
}
return -1;
}
#endregion
#region 逻辑判断
public static bool IsMoveEnd(int slvAddr, int targetPosition, DateTime time, out string msg)
{
ShuoKeInfo shuokeInfo = GetStatus(slvAddr);
msg = " IsInMove【" + shuokeInfo.IsInMove + "】 ";
if (shuokeInfo.IsInMove == 0 && shuokeInfo.UpdateTime > time)
{
int position = GetABSPosition(slvAddr);
msg += "位置【" + position + "】";
if (Math.Abs(position - targetPosition) < 10 || targetPosition.Equals(-2000))
{
return true;
}
else
{
LogUtil.info("【" + PortName + "】 目标位置【" + targetPosition + "】当前位置【" + position + "】,已经不再运动中");
}
}
return false;
}
//public static bool IsHomeMoveEnd(int slvAddr, DateTime time, out string msg)
//{
// ShuoKeInfo shuokeInfo = GetStatus(slvAddr);
// msg = " IsInMove【" + shuokeInfo.IsInMove + "】Org【" + shuokeInfo.Org + "】";
// if (shuokeInfo.IsInMove .Equals(0) && shuokeInfo.Org.Equals(0)&&shuokeInfo.UpdateTime>time)
// {
// return true;
// }
// //如果是运动结束状态,但原点未到达,直接重新开始运动
// else if (shuokeInfo.IsInMove.Equals(0) && shuokeInfo.Org.Equals(1) && shuokeInfo.UpdateTime > time)
// {
// TimeSpan span = DateTime.Now - lastRHomeTime;
// if (span.TotalSeconds > 3)
// {
// LogUtil.error("【" + PortName + "】已经停止运动但不在原点,重新回原点");
// lastRHomeTime = DateTime.Now;
// HomeMove(slvAddr);
// }
// }
// return false;
//}
#endregion
#region 驱动器操作方法
public static ShuoKeInfo GetStatus(int slvAddr)
{
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.SearchMoveStatus, 0x00, 0,10);
return DataToStatus(reviceData);
}
public static void DStoop(int slvAddr)
{
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.DStopMove, 0x00, 0,DReviceLength);
}
public static void SuddownStop(int slvAddr)
{
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.SuddownStopMove, 0x00, 0, DReviceLength);
}
public static int GetABSPosition(int slvAddr)
{
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.GetAbsPosition, 0x00, 0, 9);
return DataToPosition(reviceData);
}
// <param name="homeType">0=反方向,1=正方向</param>
public static void HomeMove(int slvAddr, byte homeType=1)
{
string fangx = homeType.Equals(0) ? "反方向" : "正方向";
LogUtil.info("压紧轴原点返回:" + fangx);
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.HomeMove, 0x01, homeType, DReviceLength);
}
public static void SetConfigSpeed(AC_SA_Config Config)
{
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetAddSpeed, Config.CompressAxis_AddSpeed);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetDelSpeed, Config.CompressAxis_DelSpeed);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetEndSpeed, Config.CompressAxis_EndSpeed);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetHomeSpeed, Config.CompressAxis_HomeSpeed);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetMaxSpeed, Config.CompressAxis_MaxSpeed);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetStartSpeed, Config.CompressAxis_StartSpeed);
}
public static void VolMove(int slvAddr, int speed)
{
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.VolMove, 0x04, speed, DReviceLength);
}
public static void AbsMove(int slvAddr, int TargetPosition)
{
// 47、设置绝对位置并开始运动:不支持广播(开环的32位脉冲统计长度)
//正负数表示绝对位置,如果已经到位置,则不做运动。(M4505S特有命令)
//发送: 应答:
//[设备地址] 0x01 [设备地址] 0x01
//[命令] 0x50 [命令] 0x50
//[数据长度] 4 [数据长度] 0
//[数据] xxxxxxxx [数据] 无
//[CRC校验1] 0xnn [CRC校验1] 0xnn
//[CRC校验2] 0xnn [CRC校验2] 0xnn
//数据:4BYTE,(支持32位有符号脉冲位置)
byte[] reviceData = SendData(slvAddr, ShuoKeCMD.AbsMove, 0x04, TargetPosition, DReviceLength);
}
public static void RelativeMove(int slvAddr, int position)
{
//1是正方向
byte fangxiang = 0x01;
if (position < 0)
{
fangxiang = 0x00;
position = Math.Abs(position);
}
byte dataLength = 0x04;
byte[] sendData = new byte[5 + dataLength];
sendData[0] = (byte)slvAddr;
sendData[1] = ShuoKeCMD.RelativeMove;
sendData[2] = dataLength;
sendData[3] = 0x00;
sendData[4] = 0x00;
sendData[5] = 0x00;
sendData[6] = 0x00;
string speed = Convert.ToString(position, 16);
byte[] speedByte = AcSerialBean.StringToByte(speed);
for (int i = 0; i < speedByte.Length; i++)
{
if (i >= 4)
{
break;
}
sendData[6 - (speedByte.Length - 1 - i)] = speedByte[i];
}
sendData[3] = fangxiang;
sendData = buildCheckData(sendData, 3 + dataLength);
byte[] reviceData = SendCommand(sendData,SleepMS,DReviceLength);
Thread.Sleep(SleepMS);
}
public static void PositionClear(int slvAddr, byte setCMD)
{
byte[] reviceData = SendData(slvAddr, setCMD, 0x00, 0, DReviceLength);
}
/// <summary>
/// 设置电机的速度
/// </summary>
/// <param name="slvAddr">电机地址</param>
/// <param name="setCMD">设置速度的命令号</param>
/// <param name="speedValue">速度值</param>
public static void SetSpeed(int slvAddr, byte setCMD, int speedValue)
{
byte[] reviceData = SendData(slvAddr, setCMD, 0x04, speedValue, DReviceLength);
Thread.Sleep(10);
}
private static byte[] SendData(int slvAddr, byte cmd, byte dataLength, int dataValue, int reviceDataLength)
{
byte[] sendData = new byte[5 + dataLength];
sendData[0] = (byte)slvAddr;
sendData[1] = cmd;
sendData[2] = dataLength;
if (dataLength.Equals(0x00))
{
}
else if (dataLength.Equals(0x01))
{
sendData[3] = (byte)dataValue;
}
else if (dataLength.Equals(0x04))
{
sendData[3] = 0x00;
sendData[4] = 0x00;
sendData[5] = 0x00;
sendData[6] = 0x00;
string speed = Convert.ToString(dataValue, 16);
byte[] speedByte = AcSerialBean.StringToByte(speed);
for (int i = 0; i < speedByte.Length; i++)
{
if (i >= 4)
{
break;
}
sendData[6 - (speedByte.Length - 1 - i)] = speedByte[i];
}
}
sendData = buildCheckData(sendData, 3 + dataLength);
byte[] reviceData = SendCommand(sendData, SleepMS, reviceDataLength);
Thread.Sleep(SleepMS);
return reviceData;
}
private static byte[] buildCheckData(byte[] sendData, int length)
{
ushort pChecksum = 0;
AcSerialBean.CalculateCRC(sendData, length, out pChecksum);
string checkStr = Convert.ToString(pChecksum, 16);
byte[] checkByte = AcSerialBean.StringToByte(checkStr);
if (checkByte.Length == 1)
{
sendData[length] = checkByte[0];
sendData[length + 1] = 0x00;
}
else
{
sendData[length + 1] = checkByte[0];
sendData[length] = checkByte[1];
}
return sendData;
}
#endregion
}
public class ShuoKeCMD
{
/// <summary>
/// 设置运动初速度://SndHex:01 25 04 00 00 00 64 FC DE
/// </summary>
public static byte SetStartSpeed = 0x25;
/// <summary>
/// 设置运动最大速度://SndHex:01 27 04 00 00 27 10 E6 EB
/// </summary>
public static byte SetMaxSpeed = 0x27;
/// <summary>
/// 设置运动末速度://SndHex:01 29 04 00 00 03 E8 FD 47
/// </summary>
public static byte SetEndSpeed = 0x29;
/// <summary>
/// 设置运动加速度://SndHex:01 2B 04 00 00 13 88 F1 4D
/// </summary>
public static byte SetAddSpeed = 0x2B;
/// <summary>
/// 设置运动减速度://SndHex:01 2D 04 00 00 03 E8 FC C3
/// </summary>
public static byte SetDelSpeed = 0x2D;
/// <summary>
/// 设置归零运动速度://SndHex:01 2F 04 00 00 27 10 E7 A3
/// </summary>
public static byte SetHomeSpeed = 0x2F;
/// <summary>
/// //查找原点命令:
//SndHex:01 3E 01 00 61 84
/// </summary>
public static byte HomeMove = 0x3E;
/// <summary>
/// 绝对位置运动//SndHex:01 50 04 FF FF D8 F0 AC 30
/// </summary>
public static byte AbsMove = 0x50;
/// <summary>
/// 急停命令://SndHex:01 3C 00 31 00
/// </summary>
public static byte SuddownStopMove = 0x3C;
/// <summary>
/// 减速停止命令://SndHex:01 3D 00 30 90
/// </summary>
public static byte DStopMove = 0x3D;
/// <summary>
/// 绝对位置清零: //SndHex:01 38 00 33 C0
/// </summary>
public static byte AbsPositionClear = 0x38;
/// <summary>
/// 相对位置清零: //SndHex:01 3A 00 32 A0
/// </summary>
public static byte RelPositionClear = 0x3A;
/// <summary>
/// 查询运动状态://SndHex:01 3B 00 33 30
/// </summary>
public static byte SearchMoveStatus = 0x3B;
/// <summary>
//查询设备地址://SndHex:00 21 00 69 90
/// </summary>
public static byte SearchSlvAddr = 0x21;
/// <summary>
/// 设置32位运动速度,并恒速运动:SndHex:01 33 04 00 00 27 10 E5 FF
/// </summary>
public static byte VolMove = 0x33;
/// <summary>
/// 查询绝对位置
/// </summary>
public static byte GetAbsPosition = 0x37;
/// <summary>
/// 相对位置运动
/// </summary>
public static byte RelativeMove = 0x32;
}
public class ShuoKeInfo
{
public ShuoKeInfo(int slv, int position)
{
this.IsInMove = -1;
this.SlvAddr = slv;
this.LLimit = -1;
this.RLimit = -1;
this.Org = -1;
this.En = -1;
UpdateTime = DateTime.Now;
LastPosition = position;
}
public ShuoKeInfo(int ismove, int slv, int ll, int org, int rl, int en)
{
this.IsInMove = ismove;
this.SlvAddr = slv;
this.LLimit = ll;
this.RLimit = rl;
this.Org = org;
this.En = en;
UpdateTime = DateTime.Now;
LastPosition = 0;
}
public int LastPosition { get; set; }
/// <summary>
/// 驱动器地址
/// </summary>
public int SlvAddr { get; set; }
/// <summary>
/// 是否在运动中
/// </summary>
public int IsInMove { get; set; }
/// <summary>
/// 左极限
/// </summary>
public int LLimit { get; set; }
/// <summary>
/// 右极限
/// </summary>
public int RLimit { get; set; }
/// <summary>
/// 原点信号是否有效
/// </summary>
public int Org { get; set; }
/// <summary>
/// 使能是否有效
/// </summary>
public int En { get; set; }
public DateTime UpdateTime { get; set; }
public string ToShowStr()
{
return "运动[" + IsInMove + "]左限位[" + LLimit + "]右限位[" + RLimit + "]原点[" + Org + "]使能[" + En + "][" + UpdateTime.ToShortTimeString() + "]";
}
}
}
类型,说明,名称,属性值,设备名称,默认值,描述,电器定义,代码定义,SlaveID,
DI,急停,SuddenStop_BTN,200,192.168.200.11,0,急停,X01,DI-01,0,
DI,复位,Reset_BTN,201,192.168.200.11,0,复位,X02,DI-02,0,
DI,自动,AutoRun_Signal,202,192.168.200.11,0,自动,X03,DI-03,0,
DI,气压检测,Airpressure_Check,203,192.168.200.11,0,气压检测,X04,DI-04,0,
DI,料盘检测1(进料口),TrayCheck_Door,204,192.168.200.11,0,料盘检测1(进料口),X05,DI-05,0,
DI,料盘检测2(料叉),TrayCheck_Fixture,205,192.168.200.11,0,料盘检测2(料叉),X06,DI-06,0,
DI,进料口门上升端,Door_Up,206,192.168.200.11,0,进料口门上升端,X07,DI-07,0,
DI,进料口门下降端,Door_Down,207,192.168.200.11,0,进料口门下降端,X08,DI-08,0,
,,,208,192.168.200.11,0,,X09,DI-09,0,
,,,209,192.168.200.11,0,,X10,DI-10,0,
DI,前门限位,Door_LimitSingle,210,192.168.200.11,0,前门限位,X11,DI-11,0,
,,,211,192.168.200.11,0,,X12,DI-12,0,
DI,安全光栅,SafetyLightCurtains,212,192.168.200.11,0,安全光栅,X13,DI-13,0,
,,,213,192.168.200.11,0,,X14,DI-14,0,
,,,214,192.168.200.11,0,,X15,DI-15,0,
DI,压紧机构计量检测,CompressAxis_Check,215,192.168.200.11,0,压紧机构计量检测,X16,DI-16,0,
DO,自动指示灯,AutoRun_HddLed,100,192.168.200.11,0,自动指示灯,Y01,DO-01,0,
DO,故障指示灯,Alarm_HddLed,101,192.168.200.11,0,故障指示灯,Y02,DO-02,0,
DO,待机指示灯,RunSign_HddLed,102,192.168.200.11,0,待机指示灯,Y03,DO-03,0,
DO,吹气SOL ON,StartOrStopBlow,103,192.168.200.11,0,吹气SOL ON,Y04,DO-04,0,
DO,料仓运转ON,Run_Signal,104,192.168.200.11,0,料仓运转ON,Y05,DO-05,0,
DO,轴2刹车电源ON,Axis_Brake,105,192.168.200.11,0,轴2刹车电源ON,Y06,DO-06,0,
DO,进料口门上升SOL,Door_Up,106,192.168.200.11,0,进料口门上升SOL,Y07,DO-07,0,
DO,进料口门下降SOL,Door_Down,107,192.168.200.11,0,进料口门下降SOL,Y08,DO-08,0,
,,,108,192.168.200.11,0,,Y09,DO-09,0,
,,,109,192.168.200.11,0,,Y10,DO-10,0,
DO,相机照明开,CameraLight_Power,110,192.168.200.11,0,相机照明开,Y11,DO-11,0,
,,,111,192.168.200.11,0,,Y12,DO-12,0,
,,,112,192.168.200.11,0,,Y13,DO-13,0,
,,,113,192.168.200.11,0,,Y14,DO-14,0,
,,,114,192.168.200.11,0,,Y15,DO-15,0,
,,,115,192.168.200.11,0,,Y16,DO-16,0,
,,,,,,,,,,
PRO,IO模块对应的DI数量,IO_DILength,192.168.200.11#16,,,,,,,
PRO,模块对应的DO数量,IO_DOLength,192.168.200.11#16,,,,,,,
,,,,,,,,,,
DI,急停,SuddenStop_BTN,0,192.168.200.11,0,急停,X01,DI-01,0,
DI,复位,Reset_BTN,1,192.168.200.11,0,复位,X02,DI-02,0,
DI,自动,AutoRun_Signal,2,192.168.200.11,0,自动,X03,DI-03,0,
DI,气压检测,Airpressure_Check,3,192.168.200.11,0,气压检测,X04,DI-04,0,
DI,料盘检测1(进料口),TrayCheck_Door,4,192.168.200.11,0,料盘检测1(进料口),X05,DI-05,0,
DI,料盘检测2(料叉),TrayCheck_Fixture,5,192.168.200.11,0,料盘检测2(料叉),X06,DI-06,0,
DI,进料口门上升端,Door_Up,6,192.168.200.11,0,进料口门上升端,X07,DI-07,0,
DI,进料口门下降端,Door_Down,7,192.168.200.11,0,进料口门下降端,X08,DI-08,0,
DI,安全光栅,SafetyLightCurtains,8,192.168.200.11,0,安全光栅,X09,DI-09,0,
DI,前门限位,Door_Limit,9,192.168.200.11,0,前门限位,X10,DI-10,0,
DI,左侧门限位,Door_LeftLimit,10,192.168.200.11,0,左侧门限位,X11,DI-11,0,
DI,右侧门限位,Door_RightLimit,11,192.168.200.11,0,右侧门限位,X12,DI-12,0,
,,,12,192.168.200.11,0,,X13,DI-13,0,
,,,13,192.168.200.11,0,,X14,DI-14,0,
,,,14,192.168.200.11,0,,X15,DI-15,0,
,,,15,192.168.200.11,0,,X16,DI-16,0,
DO,自动指示灯,AutoRun_HddLed,0,192.168.200.11,0,自动指示灯,Y01,DO-01,0,
DO,故障指示灯,Alarm_HddLed,1,192.168.200.11,0,故障指示灯,Y02,DO-02,0,
DO,待机指示灯,RunSign_HddLed,2,192.168.200.11,0,待机指示灯,Y03,DO-03,0,
DO,故障蜂鸣器,Alarm_Buzzer,3,192.168.200.11,0,故障蜂鸣器,Y04,DO-04,0,
DO,吹气SOL ON,StartOrStopBlow,4,192.168.200.11,0,吹气SOL ON,Y05,DO-05,0,
DO,料仓运转ON,Run_Signal,5,192.168.200.11,0,料仓运转ON,Y06,DO-06,0,
DO,轴2刹车电源ON,Axis_Brake,6,192.168.200.11,0,轴2刹车电源ON,Y07,DO-07,0,
DO,进料口门上升SOL,Door_Up,7,192.168.200.11,0,进料口门上升SOL,Y08,DO-08,0,
DO,进料口门下降SOL,Door_Down,8,192.168.200.11,0,进料口门下降SOL,Y09,DO-09,0,
DO,相机照明开,Camera_Led,9,192.168.200.11,0,相机照明开,Y10,DO-10,0,
,,,10,192.168.200.11,0,,Y11,DO-11,0,
,,,11,192.168.200.11,0,,Y12,DO-12,0,
,,,12,192.168.200.11,0,,Y13,DO-13,0,
,,,13,192.168.200.11,0,,Y14,DO-14,0,
,,,14,192.168.200.11,0,,Y15,DO-15,0,
,,,15,192.168.200.11,0,,Y16,DO-16,0,
AXIS,(轴一)旋转轴,Middle_Axis,1,COM1,0,,,,,
AXIS,(轴二)升降轴轴,UpDown_Axis,2,COM1,0,,,,,
AXIS,(轴三)进出轴,InOut_Axis,3,COM1,0,,,,,
AXIS,(轴四)压紧轴,Comp_Axis,4,COM1,0,,,,,
PRO,升降轴 进料口取料点 P1,UpDownAxis_DoorOPosition_P1,403000,,,,,,,
PRO,升降轴 进料口出料前点 P2,UpDownAxis_DoorIPosition_P2,415000,,,,,,,
PRO,升降轴 进料口取料缓冲点 P7,UpDownAxis_DoorOBPosition_P7,415000,,,,,,,
PRO,升降轴 进料口出料缓冲点 P8,UpDownAxis_DoorIBPosition_P8,403000,,,,,,,
PRO,旋转轴(轴1)P1 待机原位点,MiddleAxis_P1_Position,268093,,,,,,,
PRO,进出轴(轴3)P1待机原位点,InOutAxis_P1_Position,1000,,,,,,,
PRO,压紧轴(轴4)P1待机原位点,CompressAxis_P1_Position,-7500,,,,,,,
PRO,压紧轴(轴4)P1待机原位点,CompressAxis_P1_Position,2000,,,,,,,
PRO,是否使用定位气缸,IsHasLocationCylinder,0,,,,,,,
PRO,是否有左右侧门,IsHasDoorLimit,1,,,,,,,
PRO,是否使用压紧轴(1=使用),IsHasCompress_Axis,1,,,,, ,,
......@@ -67,6 +72,13 @@ PRO,(轴三)进出轴减速度,InoutAxis_DelSpeed,300,,,,,,,
PRO,(轴三)进出轴原点低速,InoutAxis_HomeLowSpeed,20,,,,,,,
PRO,(轴三)进出轴原点高速,InoutAxis_HomeHighSpeed,60,,,,,,,
PRO,(轴三)进出轴原点加速度,InoutAxis_HomeAddSpeed,200,,,,,,,
PRO,(轴四)压紧轴目标速度,CompAxis_TargetSpeed,100,,,,,,,
PRO,(轴四)压紧轴加速度,CompAxis_AddSpeed,300,,,,,,,
PRO,(轴四)压紧轴减速度,CompAxis_DelSpeed,300,,,,,,,
PRO,(轴四)压紧轴原点低速,CompAxis_HomeLowSpeed,20,,,,,,,
PRO,(轴四)压紧轴原点高速,CompAxis_HomeHighSpeed,60,,,,,,,
PRO,(轴四)压紧轴原点加速度,CompAxis_HomeAddSpeed,200,,,,,,,
,,,,,,,,,,
PRO,升降轴(轴2)P1速度,UpDownAxis_P1_Speed,250,,,,,,,
PRO,升降轴(轴2)P2速度,UpDownAxis_P2_Speed,250,,,,,,,
PRO,升降轴(轴2)P3速度,UpDownAxis_P3_Speed,250,,,,,,,
......@@ -80,6 +92,9 @@ PRO,旋转轴(轴1)P2速度,MiddleAxis_P2_Speed,120,,,,,,,
PRO,进出轴(轴3)P1速度,InOutAxis_P1_Speed,100,,,,,,,
PRO,进出轴(轴3)P2速度,InOutAxis_P2_Speed,100,,,,,,,
PRO,进出轴(轴3)P3速度,InOutAxis_P3_Speed,1000,,,,,,,
PRO,压紧轴(轴4)P1速度,CompAxis_P1_Speed,100,,,,,,,
PRO,压紧轴(轴4)P2速度,CompAxis_P2_Speed,100,,,,,,,
PRO,压紧轴(轴4)P3速度,CompAxis_P3_Speed,100,,,,,,,
PRO,(轴一)旋转轴停止时可误差的脉冲数的最小值,MiddleAxis_ErrorCountMin,10,,,,,,,
PRO,(轴二)升降轴轴停止时可误差的脉冲数的最小值,UpdownAxis_ErrorCountMin,10,,,,,, ,
PRO,(轴三)进出轴停止时可误差的脉冲数的最小值,InoutAxis_ErrorCountMin,10,,,,,,,
......@@ -102,18 +117,6 @@ PRO,每次吹气的时间(分钟),BlowAir_Time,10,,,,,,,
PRO,两次吹气间隔(分钟),BlowAir_Interval,10,,,,,,,
PRO,温湿度端口号,Humiture_Port,COM2,,,,,,,
,,,,,,,,, ,
PRO,硕科步进电机(压紧轴)控制端口号,CompressAxis_PortName,COM6,,,,,,,
PRO,硕科步进电机(压紧轴)控制波特率,CompressAxis_PortBaudrate,9600,,,,,,,
PRO,硕科步进电机(压紧轴)控制奇偶校验,CompressAxis_PortParity,0,,,,,,,
PRO,硕科步进电机(压紧轴)控制停止位,CompressAxis_StopBits,1,,,,,,,
PRO,硕科步进电机(压紧轴)控制初速度,CompressAxis_StartSpeed,5000,,,,,,,
PRO,硕科步进电机(压紧轴)控制最大速度,CompressAxis_MaxSpeed,8000,,,,,,,
PRO,硕科步进电机(压紧轴)控制末速度,CompressAxis_EndSpeed,6000,,,,,,,
PRO,硕科步进电机(压紧轴)控制加速度,CompressAxis_AddSpeed,3000,,,,,,,
PRO,硕科步进电机(压紧轴)控制减速度,CompressAxis_DelSpeed,3000,,,,,,,
PRO,硕科步进电机(压紧轴)控制归零速度(原点返回速度),CompressAxis_HomeSpeed,5000,,,,,,,
PRO,硕科步进电机轴地址(压紧轴),CompressAxis_Slv,1,,,,,,,
,,,,,,,,, ,
PRO,模拟量IO模块的IP地址,AIDevice_IP,192.168.200.12,,,,,,,
PRO,模拟信号1默认高度,AIDI1_DefaultPosition,2920,,,,,,,
PRO,模拟信号2默认高度,AIDI2_DefaultPosition,2960,,,,,,,
......@@ -125,5 +128,7 @@ PRO,模拟信号2的地址,AIDI2_Addr,8,,,,,,,
PRO,模拟信号3的地址,AIDI3_Addr,5,,,,,,,
PRO,模拟信号4的地址,AIDI4_Addr,6,,,,,,,
,,,,,,,,, ,
PRO,模拟转换系数,AI_ConvertPosition,55,,,,,,,
,,,,,,,,, ,
PRO,默认的料盘宽度(多种尺寸为0),Default_TrayWidth,0,,,,,,,
PRO,特殊二维码尺寸配置,CodeSizeConfig,XA=13x48#XB=13x32#FA=7x32,,,,,,,
......@@ -41,6 +41,7 @@ namespace OnlineStore.DeviceLibrary
/// 是否有压紧轴
/// </summary>
public bool IsHasCompress_Axis = true;
public bool UseBuzzer = ConfigAppSettings.GetIntValue(Setting_Init.UseBuzzer).Equals(1);
//public ScanSocket scanSocket = new ScanSocket();
private System.Timers.Timer serverConnectTimer = new System.Timers.Timer();
private System.Timers.Timer IoCheckTimer = new System.Timers.Timer();
......@@ -88,10 +89,11 @@ namespace OnlineStore.DeviceLibrary
//初始化摄像机配置
CodeManager.LoadConfig( );
IOManager.Init();
//初始化 //连接设备
KNDManager.ConnectionKND(Config.DIODeviceNameList);
KNDAIManager.ConnectionIP(Config.AIDevice_IP);
IOManager.instance.ConnectionIOList(Config.DIODeviceNameList);
AIManager.Init();
AIManager.Instance.ConnectionIP(Config.AIDevice_IP);
//scanSocket.OnScanRevice += onCodeReceived;
mainTimer.Enabled = false;
......@@ -103,9 +105,9 @@ namespace OnlineStore.DeviceLibrary
Thread.Sleep(300);
//默认三个灯都亮
KNDIOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
}
private void IoCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
......@@ -113,7 +115,7 @@ namespace OnlineStore.DeviceLibrary
//判断急停
if (storeRunStatus >= StoreRunStatus.HomeMoving)
{
if (KNDIOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
{
if (isInSuddenDown.Equals(false))
{
......@@ -143,11 +145,18 @@ namespace OnlineStore.DeviceLibrary
moveAxisList.Add(Config.Middle_Axis);
moveAxisList.Add(Config.UpDown_Axis);
moveAxisList.Add(Config.InOut_Axis);
this.AxisAlarmCodeMap = new Dictionary<string, AxisAlarmInfo>();
this.AxisAlarmCodeMap.Add(Config.UpDown_Axis.GetNameStr(), new AxisAlarmInfo());
this.AxisAlarmCodeMap.Add(Config.InOut_Axis.GetNameStr(), new AxisAlarmInfo());
this.AxisAlarmCodeMap.Add(this.Config.Middle_Axis.GetNameStr(), new AxisAlarmInfo());
if (Config.IsHasCompress_Axis.Equals(1))
{
moveAxisList.Add(Config.Comp_Axis);
this.AxisAlarmCodeMap.Add(this.Config.Comp_Axis.GetNameStr(), new AxisAlarmInfo());
}
}
/// <summary>
......@@ -157,21 +166,21 @@ namespace OnlineStore.DeviceLibrary
{
LogUtil.info(LOGGER, StoreName + "开始启动,启动时间:" + StartTime.ToString());
if (IsHasCompress_Axis)
{
if (ShuoKeControls.isRun == false && (!StoreManager.OpenShuoKe(this)))
{
LogUtil.info(StoreName + "打开驱动器串口失败,启动失败!");
return false;
}
}
//if (IsHasCompress_Axis)
//{
// if (ShuoKeControls.isRun == false && (!StoreManager.OpenShuoKe(this)))
// {
// LogUtil.info(StoreName + "打开驱动器串口失败,启动失败!");
// return false;
// }
//}
autoNext = false;
mainTimer.Enabled = false;
alarmType = StoreAlarmType.None;
//急停按钮和气压检测需要一起判断
IO_VALUE suddenBtn = KNDIOValue(IO_Type.SuddenStop_BTN);
IO_VALUE airCheck = KNDIOValue(IO_Type.Airpressure_Check);
IO_VALUE suddenBtn = IOManager.IOValue(IO_Type.SuddenStop_BTN);
IO_VALUE airCheck = IOManager.IOValue(IO_Type.Airpressure_Check);
//if (suddenBtn == IO_VALUE.HIGH)
if (suddenBtn == IO_VALUE.HIGH && airCheck == IO_VALUE.HIGH)
......@@ -220,9 +229,9 @@ namespace OnlineStore.DeviceLibrary
WarnMsg = "";
CurrInOutACount = 0;
CurrInOutCount = 0;
KNDIOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
storeRunStatus = StoreRunStatus.HomeMoving;
StoreMove.NewMove(StoreMoveType.ReturnHome);
......@@ -230,23 +239,9 @@ namespace OnlineStore.DeviceLibrary
ACAxisHomeMove(Config.InOut_Axis);
LogUtil.info(LOGGER, StoreName + "开始原点返回,先把进出轴回原点");
//设置速度
SetShuokeSpeed();
//SetShuokeSpeed();
StoreMove.WaitList.Add(WaitResultInfo.WaitTime(2000));
}
public void SetShuokeSpeed()
{
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetAddSpeed, Config.CompressAxis_AddSpeed);
Thread.Sleep(60);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetDelSpeed, Config.CompressAxis_DelSpeed);
Thread.Sleep(60);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetEndSpeed, Config.CompressAxis_EndSpeed);
Thread.Sleep(60);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetHomeSpeed, Config.CompressAxis_HomeSpeed);
Thread.Sleep(60);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetMaxSpeed, Config.CompressAxis_MaxSpeed);
Thread.Sleep(60);
ShuoKeControls.SetSpeed(Config.CompressAxis_Slv, ShuoKeCMD.SetStartSpeed, Config.CompressAxis_StartSpeed);
}
}
public void MoveToP1()
{
//压紧轴回原点,叉子回到P1,关闭门旋转轴和升降轴回到P1
......@@ -254,7 +249,7 @@ namespace OnlineStore.DeviceLibrary
StoreMove.NextMoveStep(StoreMoveStep.BOX_M_H_TOP1_InOutToP1);
LogUtil.info(LOGGER, StoreName + "到待机状态,进出轴到P1,判断叉子没有料盘");
ACAxisMove(Config.InOut_Axis, Config.InOutAxis_P1_Position, Config.InOutAxis_P1_Speed);
ComBeforeHomeMove();
// ComBeforeHomeMove();
//判断叉子没有料盘
//StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.TrayCheck_Fixture, IO_VALUE.LOW));
}
......@@ -271,9 +266,9 @@ namespace OnlineStore.DeviceLibrary
CurrInOutCount = 0;
CurrInOutACount = 0;
KNDIOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
//复位之前先停止运行
if (isNeedClearAuto)
{
......@@ -303,7 +298,7 @@ namespace OnlineStore.DeviceLibrary
{
InoutStartReset();
//硕科压紧轴回原点
SetShuokeSpeed();
//SetShuokeSpeed();
}
else
{
......@@ -318,22 +313,11 @@ namespace OnlineStore.DeviceLibrary
{
string portName = Config.InOut_Axis.DeviceName;
int slvAddr = Config.InOut_Axis.GetAxisValue();
//if (ACServerManager.GetHomeEndStatus(portName, slvAddr).Equals(1)
// && ACServerManager.GetHomeSingle(portName, slvAddr).Equals(1))
//{
// StoreMove.NextMoveStep(StoreMoveStep.BOX_H_InOutMove);
// LogUtil.info(LOGGER, StoreName + "复位中,进出轴原点亮且已经原点返回过,先相对走-5000");
// int currPos = ACServerManager.GetActualtPosition(portName, slvAddr);
// int targetPos = currPos - 5000;
// ACAxisMove(Config.InOut_Axis, targetPos, Config.InoutAxis_HomeLowSpeed);
//}
//else
//{
StoreMove.NextMoveStep(StoreMoveStep.BOX_H_InOutBack);
LogUtil.info(LOGGER, StoreName + "复位中,进出轴开始原点返回");
ACAxisHomeMove(Config.InOut_Axis);
StoreMove.WaitList.Add(WaitResultInfo.WaitTime(2000));
//}
StoreMove.WaitList.Add(WaitResultInfo.WaitTime(2000));
}
/// <summary>
/// 复位处理
......@@ -370,7 +354,7 @@ namespace OnlineStore.DeviceLibrary
//进出轴原点返回完成,将进出轴的位置设置=0
AxisCountClear(Config.InOut_Axis);
ACAxisMove(Config.InOut_Axis, Config.InOutAxis_P1_Position, Config.InOutAxis_P1_Speed);
ComBeforeHomeMove();
// ComBeforeHomeMove();
//判断叉子没有料盘
//StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.TrayCheck_Fixture, IO_VALUE.LOW));
CloseDoorAndWait();
......@@ -386,9 +370,7 @@ namespace OnlineStore.DeviceLibrary
StoreMove.NextMoveStep(StoreMoveStep.BOX_H_OtherAxisBack);
if (IsHasCompress_Axis)
{
StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, 0, true));
ShuoKeControls.HomeMove(Config.CompressAxis_Slv, 1);
Thread.Sleep(60);
ACAxisHomeMove(Config.Comp_Axis);
}
ACAxisHomeMove(Config.Middle_Axis);
ACAxisHomeMove(Config.UpDown_Axis);
......@@ -399,7 +381,7 @@ namespace OnlineStore.DeviceLibrary
LogUtil.info(LOGGER, StoreName + "复位中:旋转轴运动到P1,上下轴走到P1,压紧轴到P1!");
ACAxisMove(Config.Middle_Axis, Config.MiddleAxis_P1_Position, Config.MiddleAxis_P1_Speed);
ACAxisMove(Config.UpDown_Axis, Config.UpDownAxis_DoorOPosition_P1, Config.UpDownAxis_P1_Speed);
ComMoveToPosition(Config.CompressAxis_P1_Position);
ComMoveToPosition(Config.CompressAxis_P1_Position,Config.CompAxis_P1_Speed);
break;
case StoreMoveStep.BOX_H_MiddleAxisToP1:
LogUtil.info(LOGGER, StoreName + "复位完成");
......@@ -416,9 +398,8 @@ namespace OnlineStore.DeviceLibrary
StoreMove.NextMoveStep(StoreMoveStep.BOX_M_H_TOP1_CompressHome);
LogUtil.info(LOGGER, StoreName + "到待机状态,压紧轴回原点,关闭舱门");
if (IsHasCompress_Axis)
{
StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, 1, true));
ShuoKeControls.HomeMove(Config.CompressAxis_Slv, 1);
{
ACAxisHomeMove(Config.Comp_Axis);
}
//关闭舱门
CloseDoorAndWait();
......@@ -428,7 +409,7 @@ namespace OnlineStore.DeviceLibrary
LogUtil.info(LOGGER, StoreName + "复位中:旋转轴运动到P1,上下轴走到P1,压紧轴到P1!");
ACAxisMove(Config.Middle_Axis, Config.MiddleAxis_P1_Position, Config.MiddleAxis_P1_Speed);
ACAxisMove(Config.UpDown_Axis, Config.UpDownAxis_DoorOPosition_P1, Config.UpDownAxis_P1_Speed);
ComMoveToPosition(Config.CompressAxis_P1_Position);
ComMoveToPosition(Config.CompressAxis_P1_Position,Config.CompAxis_P1_Speed);
break;
case StoreMoveStep.BOX_M_H_TOP1_OtherAxisToP1:
LogUtil.info(LOGGER, StoreName + "到待机状态完成");
......@@ -443,49 +424,27 @@ namespace OnlineStore.DeviceLibrary
default: break;
}
}
private void ComBeforeHomeMove()
{
if (IsHasCompress_Axis)
{
int relValue = -2000;
LogUtil.debug("压紧轴相对位置:" + relValue);
StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, relValue, false));
ShuoKeControls.RelativeMove(Config.CompressAxis_Slv, relValue);
Thread.Sleep(100);
}
}
private void ComMoveToPosition(int targetPosition)
{
ComMoveToPosition(targetPosition, false);
}
private void ComMoveToPosition(int targetPosition, bool isNeedCheckSingle)
}
private void ComMoveToPosition(int targetPosition, int targetSpeed)
{
if (IsHasCompress_Axis)
{
LogUtil.debug("压紧轴绝对运动目标位置:" + targetPosition);
if (isNeedCheckSingle)
{
MeteringSignal.StartCheck(targetPosition, ShuoKeControls.GetABSPosition(Config.CompressAxis_Slv));
}
StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, targetPosition, false));
ShuoKeControls.AbsMove(Config.CompressAxis_Slv, targetPosition);
Thread.Sleep(10);
ACAxisMove(Config.Comp_Axis, targetPosition, targetSpeed);
}
}
private void OpenDoorAndWait()
{
Thread.Sleep(60);
KNDIOMove(IO_Type.Door_Down, IO_VALUE.LOW);
KNDIOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.HIGH);
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.LOW));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.HIGH));
}
private void CloseDoorAndWait()
{
KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.HIGH));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.LOW));
}
......@@ -519,7 +478,7 @@ namespace OnlineStore.DeviceLibrary
//进出轴原点返回完成,将进出轴的位置设置=0
AxisCountClear(Config.InOut_Axis);
ACAxisMove(Config.InOut_Axis, Config.InOutAxis_P1_Position, Config.InOutAxis_P1_Speed);
ComBeforeHomeMove();
// ComBeforeHomeMove();
//判断叉子没有料盘
//StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.TrayCheck_Fixture, IO_VALUE.LOW));
CloseDoorAndWait();
......@@ -537,9 +496,7 @@ namespace OnlineStore.DeviceLibrary
StoreMove.NextMoveStep(StoreMoveStep.BOX_H_OtherAxisBack);
if (IsHasCompress_Axis)
{
StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, 0, true));
ShuoKeControls.HomeMove(Config.CompressAxis_Slv, 1);
Thread.Sleep(60);
ACAxisHomeMove(Config.Comp_Axis);
}
ACAxisHomeMove(Config.Middle_Axis);
ACAxisHomeMove(Config.UpDown_Axis);
......@@ -550,7 +507,7 @@ namespace OnlineStore.DeviceLibrary
LogUtil.info(LOGGER, StoreName + "回原点:旋转轴运动到P1,上下轴到P1,压紧轴到P1!");
ACAxisMove(Config.Middle_Axis, Config.MiddleAxis_P1_Position, Config.MiddleAxis_P1_Speed);
ACAxisMove(Config.UpDown_Axis, Config.UpDownAxis_DoorOPosition_P1, Config.UpDownAxis_P1_Speed);
ComMoveToPosition(Config.CompressAxis_P1_Position);
ComMoveToPosition(Config.CompressAxis_P1_Position,Config.CompAxis_P1_Speed);
break;
case StoreMoveStep.BOX_H_MiddleAxisToP1:
LogUtil.info(LOGGER, StoreName + "回原点完成");
......@@ -566,7 +523,7 @@ namespace OnlineStore.DeviceLibrary
public bool RunAxis(bool isCheck)
{
KNDIOMove(IO_Type.Run_Signal, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Run_Signal, IO_VALUE.HIGH);
Thread.Sleep(1000);
//打开所有轴
foreach (ConfigMoveAxis moveAxis in moveAxisList)
......@@ -596,7 +553,7 @@ namespace OnlineStore.DeviceLibrary
}
}
IsIntSlvBlock = true;
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.HIGH);
return true;
}
/// <summary>
......@@ -641,7 +598,7 @@ namespace OnlineStore.DeviceLibrary
public void CloseAllAxis()
{
LogUtil.info(StoreName + "关闭刹车,关闭伺服");
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
foreach (ConfigMoveAxis axis in moveAxisList)
{
ACServerManager.ServoOff(axis.DeviceName, axis.GetAxisValue());
......@@ -649,7 +606,7 @@ namespace OnlineStore.DeviceLibrary
// ACServerManager.ColsePort(axis.DeviceName);
}
Thread.Sleep(100);
KNDIOMove(IO_Type.Run_Signal, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Run_Signal, IO_VALUE.LOW);
}
private int GetAlarmCodeByAxis(ConfigMoveAxis axis)
......@@ -691,11 +648,11 @@ namespace OnlineStore.DeviceLibrary
TimeSpan span = DateTime.Now - StartTime;
IsRun = false;
KNDManager.CloseAllDO();
if (IsHasCompress_Axis)
{
ShuoKeControls.ClosePort();
}
IOManager.instance.CloseAllDO();
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.ClosePort();
//}
LogUtil.info(LOGGER, StoreName + ",停止运行,总运行时间:" + span.ToString());
}
......@@ -715,14 +672,14 @@ namespace OnlineStore.DeviceLibrary
if (alarmType.Equals(StoreAlarmType.AxisAlarm) | alarmType.Equals(StoreAlarmType.AxisMoveError))
{
LogUtil.error(LOGGER, StoreName + "轴报警,关闭刹车,停止运动,关闭轴,打开报警灯");
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
StopMove(true);
}
else if (alarmType == StoreAlarmType.SuddenStop)
{
isInSuddenDown = true;
LogUtil.error(LOGGER, StoreName + "收到急停信号,关闭刹车,停止运动,关闭轴,打开报警灯 ");
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
StoreMove.EndMove();
StopMove(true);
storeStatus = StoreStatus.SuddenStop;
......@@ -731,7 +688,7 @@ namespace OnlineStore.DeviceLibrary
{
isNoAirCheck = true;
LogUtil.error(LOGGER, StoreName + " 未检测到气压信号 ,打开刹车,停止运动,关闭轴,打开报警灯 ");
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
StoreMove.EndMove();
StopMove(true);
storeStatus = StoreStatus.SuddenStop;
......@@ -787,7 +744,7 @@ namespace OnlineStore.DeviceLibrary
private IO_VALUE preAirValue = IO_VALUE.HIGH;
private void AirCheckProcess()
{
IO_VALUE currAirValue = KNDIOValue(IO_Type.Airpressure_Check);
IO_VALUE currAirValue = IOManager.IOValue(IO_Type.Airpressure_Check);
if (isInSuddenDown)
{
return;
......@@ -862,15 +819,15 @@ namespace OnlineStore.DeviceLibrary
{
isNeedAlarmLed = true;
}
if (isNeedAlarmLed && KNDIOValue(IO_Type.Alarm_HddLed).Equals(IO_VALUE.LOW))
if (isNeedAlarmLed && IOManager.IOValue(IO_Type.Alarm_HddLed).Equals(IO_VALUE.LOW))
{
KNDIOMove(IO_Type.Alarm_HddLed, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.HIGH);
}
else
{
if (KNDIOValue(IO_Type.Alarm_HddLed).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.Alarm_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
}
}
......@@ -878,46 +835,55 @@ namespace OnlineStore.DeviceLibrary
//报警时绿灯和黄灯灭
if (isNeedAlarmLed)
{
if (KNDIOValue(IO_Type.AutoRun_HddLed).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.AutoRun_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
}
if (KNDIOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
}
if (UseBuzzer && IOManager.IOValue(IO_Type.Alarm_Buzzer).Equals(IO_VALUE.LOW))
{
IOManager.IOMove(IO_Type.Alarm_Buzzer, IO_VALUE.HIGH);
}
return;
}
if (UseBuzzer)
{
IOManager.IOMove(IO_Type.Alarm_Buzzer, IO_VALUE.LOW);
}
//绿灯闪
if ((StoreMove.MoveType.Equals(StoreMoveType.InStore) || StoreMove.MoveType.Equals(StoreMoveType.OutStore)
|| storeRunStatus.Equals(StoreRunStatus.HomeMoving) || storeRunStatus.Equals(StoreRunStatus.Reset))
&& KNDIOValue(IO_Type.AutoRun_HddLed).Equals(IO_VALUE.HIGH))
&& IOManager.IOValue(IO_Type.AutoRun_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.LOW);
}
else
{
//绿灯亮
KNDIOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
}
//黄灯
if (StoreMove.MoveType.Equals(StoreMoveType.InStore) || StoreMove.MoveType.Equals(StoreMoveType.OutStore) || TempOrHumidityIsAlarm || isTemp30M)
{
if (KNDIOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
}
else
{
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.HIGH);
}
}
else
{
if (KNDIOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.RunSign_HddLed).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.RunSign_HddLed, IO_VALUE.LOW);
}
}
}
......@@ -934,7 +900,7 @@ namespace OnlineStore.DeviceLibrary
if (storeRunStatus.Equals(StoreRunStatus.Wait))
{
//取新的Io状态
IO_VALUE autoSingle = KNDIOValue(IO_Type.AutoRun_Signal);
IO_VALUE autoSingle = IOManager.IOValue(IO_Type.AutoRun_Signal);
if (ConfigAppSettings.GetIntValue(Setting_Init.App_AutoRun).Equals(1))
{
if (autoSingle.Equals(IO_VALUE.HIGH) && lastAutoRun.Equals(IO_VALUE.LOW))
......@@ -957,8 +923,8 @@ namespace OnlineStore.DeviceLibrary
else if (storeRunStatus >= StoreRunStatus.HomeMoving)
{
//取新的Io状态
IO_VALUE suddenBtn = KNDIOValue(IO_Type.SuddenStop_BTN);
IO_VALUE resetBtn = KNDIOValue(IO_Type.Reset_BTN);
IO_VALUE suddenBtn = IOManager.IOValue(IO_Type.SuddenStop_BTN);
IO_VALUE resetBtn = IOManager.IOValue(IO_Type.Reset_BTN);
//急停按钮
if (suddenBtn.Equals(IO_VALUE.LOW))
......@@ -1020,7 +986,7 @@ namespace OnlineStore.DeviceLibrary
try
{
//遮挡光栅信号
if (KNDIOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.LOW))
{
if (NeedCheckSafetyLight.Equals(1))
{
......@@ -1080,10 +1046,10 @@ namespace OnlineStore.DeviceLibrary
//判断是否需要出入库
if (StoreMove.MoveType.Equals(StoreMoveType.None) && alarmType.Equals(StoreAlarmType.None))
{
IO_VALUE checkIO = KNDIOValue(IO_Type.TrayCheck_Door);
IO_VALUE checkIO = IOManager.IOValue(IO_Type.TrayCheck_Door);
int height = GetHeight();
//判断料门口是否有料
if ((checkIO.Equals(IO_VALUE.HIGH)) && height > 0 && KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
if ((checkIO.Equals(IO_VALUE.HIGH)) && height > 0 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
{
if (IsScanCode)
{
......@@ -1301,22 +1267,23 @@ namespace OnlineStore.DeviceLibrary
public override void StopMove(bool IsCloseAxis)
{
KNDIOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Axis_Brake, IO_VALUE.LOW);
//运动版停止
ACServerManager.SuddenStop(Config.Middle_Axis.DeviceName, Config.Middle_Axis.GetAxisValue());
ACServerManager.SuddenStop(Config.UpDown_Axis.DeviceName, Config.UpDown_Axis.GetAxisValue());
ACServerManager.SuddenStop(Config.InOut_Axis.DeviceName, Config.InOut_Axis.GetAxisValue());
if (IsHasCompress_Axis)
{
ShuoKeControls.SuddownStop(Config.CompressAxis_Slv);
ACServerManager.SuddenStop(Config.Comp_Axis.DeviceName, Config.Comp_Axis.GetAxisValue());
// ShuoKeControls.SuddownStop(Config.CompressAxis_Slv);
}
else
{
if (Config.IsHasLocationCylinder >= 1)
{
//定位气缸停止
KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
KNDIOMove(IO_Type.LocationCylinder_Up, IO_VALUE.LOW);
//IOManager.IOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
//IOManager.IOMove(IO_Type.LocationCylinder_Up, IO_VALUE.LOW);
}
}
if (IsCloseAxis)
......@@ -1324,8 +1291,8 @@ namespace OnlineStore.DeviceLibrary
CloseAllAxis();
}
LogUtil.info(LOGGER, StoreName + "StopMove");
KNDIOMove(IO_Type.Door_Down, IO_VALUE.LOW);
KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
isInPro = false;
}
......@@ -1494,7 +1461,7 @@ namespace OnlineStore.DeviceLibrary
{
DateTime date = DateTime.Now;
//scanTimer.Enabled = false;
KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);
// string outMsg = "";
string message = "";
bool hasSpecialCode = false;
......@@ -1572,7 +1539,7 @@ namespace OnlineStore.DeviceLibrary
// LogUtil.error("盘尺寸错误,清理二维码【" + message + "】");
// message = "";
//}
KNDIOMove(IO_Type.CameraLight_Power, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.LOW);
onCodeReceived(message);
}
......@@ -1627,13 +1594,13 @@ namespace OnlineStore.DeviceLibrary
return 0;
}
int result = 0;
if (KNDIOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.LOW))
{
return result;
}
double ai1Value = KNDAIManager.ConvertAI(KNDAIManager.GetAIValue(Config.AIDevice_IP, Config.AIDI1_Addr), Config.AIDI1_DefaultPosition);
double ai2Value = KNDAIManager.ConvertAI(KNDAIManager.GetAIValue(Config.AIDevice_IP, Config.AIDI2_Addr), Config.AIDI2_DefaultPosition);
double ai1Value = AIManager.ConvertAI(AIManager.Instance.GetAIValue(Config.AIDevice_IP, Config.AIDI1_Addr), Config.AIDI1_DefaultPosition);
double ai2Value = AIManager.ConvertAI(AIManager.Instance.GetAIValue(Config.AIDevice_IP, Config.AIDI2_Addr), Config.AIDI2_DefaultPosition);
double Value = Math.Round((ai1Value + ai2Value) / 2, 1);
if (Value > 18)
{
......@@ -1703,12 +1670,12 @@ namespace OnlineStore.DeviceLibrary
return 0;
}
int result = 0;
if (KNDIOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.TrayCheck_Door).Equals(IO_VALUE.LOW))
{
return result;
}
double ai1Value = KNDAIManager.ConvertAI(KNDAIManager.GetAIValue(Config.AIDevice_IP, Config.AIDI3_Addr), Config.AIDI3_DefaultPosition);
double ai2Value = KNDAIManager.ConvertAI(KNDAIManager.GetAIValue(Config.AIDevice_IP, Config.AIDI4_Addr), Config.AIDI4_DefaultPosition);
double ai1Value = AIManager.ConvertAI(AIManager.Instance.GetAIValue(Config.AIDevice_IP, Config.AIDI3_Addr), Config.AIDI3_DefaultPosition);
double ai2Value = AIManager.ConvertAI(AIManager.Instance.GetAIValue(Config.AIDevice_IP, Config.AIDI4_Addr), Config.AIDI4_DefaultPosition);
double Value = Math.Round((ai1Value + ai2Value) / 2, 1);
if (Value > 18)
{
......@@ -1804,7 +1771,7 @@ namespace OnlineStore.DeviceLibrary
LOGGER.Info("当前最大湿度:" + currMaxHumidity.ToString() + ",开始吹气湿度:" + startBlowHumidity + ",当前不在吹气中,且间隔超过" + Config.BlowAir_Interval + "分钟,开始吹气!");
IsInBlowing = true;
//Thread.Sleep(100);
KNDIOMove(IO_Type.StartOrStopBlow, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.HIGH);
LastBeginBlowTime = DateTime.Now;
LastEndBlowTime = DateTime.Now;
}
......@@ -1814,7 +1781,7 @@ namespace OnlineStore.DeviceLibrary
{
LOGGER.Info("当前最大湿度:" + currMaxHumidity.ToString() + ",停止吹气湿度:" + stopBlowHumidity + ",停止吹气!");
IsInBlowing = false;
KNDIOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
LastEndBlowTime = DateTime.Now;
}
if (IsInBlowing)
......@@ -1826,7 +1793,7 @@ namespace OnlineStore.DeviceLibrary
LOGGER.Info("已经吹气" + span.TotalMinutes + "分钟,超过配置的吹气时间" + Config.BlowAir_Time + "分钟,停止吹气!");
IsInBlowing = false;
//Thread.Sleep(100);
KNDIOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
LastEndBlowTime = DateTime.Now;
}
}
......@@ -1841,7 +1808,7 @@ namespace OnlineStore.DeviceLibrary
LOGGER.Info("当前温度【" + param.Temperate + "】超过最高温度【" + Max_Temperature + "】,开始报警!");
needAlarm = true;
//Thread.Sleep(100);
KNDIOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
}
else if (temp < Max_Temperature)
{
......@@ -1850,7 +1817,7 @@ namespace OnlineStore.DeviceLibrary
LOGGER.Info("不在吹气中,且当前温度【" + param.Temperate + "】低于【" + Max_Temperature + "】,关闭报警!");
TempOrHumidityIsAlarm = false;
//Thread.Sleep(100);
KNDIOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
}
}
else
......@@ -1952,7 +1919,7 @@ namespace OnlineStore.DeviceLibrary
}
if (CodeMsg.Equals(""))
{
if (storeRunStatus.Equals(StoreRunStatus.Runing) && KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
if (storeRunStatus.Equals(StoreRunStatus.Runing) && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
boxStatus.msg = "叉子料盘检测有料,请检查";
lineOperation.msg = "叉子料盘检测有料,请检查";
......@@ -2130,42 +2097,5 @@ namespace OnlineStore.DeviceLibrary
}
#endregion
#region KNDIO
public void KNDIOMove(string ioType, IO_VALUE ioValue)
{
if (Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = Config.StoreDOList[ioType];
KNDManager.WriteSingleDO(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
Thread.Sleep(60);
}
else
{
LogUtil.error(LOGGER, StoreName + "没有DO=" + ioType);
}
}
public IO_VALUE KNDIOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.LOW;
if (Config.StoreDIList.ContainsKey(ioType))
{
ConfigIO configIo = Config.StoreDIList[ioType];
ioValue = KNDManager.GetDIValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
//UpdateDoValue(ioType, ioValue);
}
else if (Config.StoreDOList.ContainsKey(ioType))
{
ConfigIO configIo = Config.StoreDOList[ioType];
ioValue = KNDManager.GetDOValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error(LOGGER, StoreName + "没有DO=" + ioType);
}
return ioValue;
}
#endregion
}
}
\ No newline at end of file
......@@ -146,7 +146,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (wait.WaitType == 2)
{
wait.IsEnd = KNDIOValue(wait.IoType).Equals(wait.IoValue);
wait.IsEnd = IOManager.IOValue(wait.IoType).Equals(wait.IoValue);
int timeOutMs = Config.IOSingle_TimerOut;
if (StoreMove.MoveStep == StoreMoveStep.SO_14_WaitTake)
{
......@@ -176,9 +176,10 @@ namespace OnlineStore.DeviceLibrary
}
else if (wait.WaitType == 5)
{
string msg = "";
wait.IsEnd = ShuoKeIsEnd(wait, out msg);
NotOkMsg = NotOkMsg +" "+ msg;
//string msg = "";
//wait.IsEnd = ShuoKeIsEnd(wait, out msg);
// NotOkMsg = NotOkMsg +" "+ msg;
wait.IsEnd = false;
}
if (wait.IsEnd)
{
......@@ -210,55 +211,7 @@ namespace OnlineStore.DeviceLibrary
}
}
private static DateTime lastComRHomeTime = DateTime.Now;
private bool ShuoKeIsEnd(WaitResultInfo wait, out string msg)
{
//bool result = false;
msg = "";
if (wait.IsHomeMove)
{
//return ShuoKeControls.IsHomeMoveEnd(wait.SlvAddr, StoreMove.LastSetpTime, out msg);
ShuoKeInfo shuokeInfo = ShuoKeControls.GetStatus(wait.SlvAddr);
msg = " IsInMove【" + shuokeInfo.IsInMove + "】Org【" + shuokeInfo.Org + "】";
if (shuokeInfo.IsInMove.Equals(0) && shuokeInfo.Org.Equals(0) )
{
return true;
}
//如果是运动结束状态,但原点未到达,直接重新开始运动
else if (shuokeInfo.IsInMove.Equals(0) && shuokeInfo.Org.Equals(1) )
{
TimeSpan span = DateTime.Now - lastComRHomeTime;
if (span.TotalSeconds > 3 && (StoreMove.CanWhileCount > 0))
{
lastComRHomeTime = DateTime.Now;
StoreMove.CanWhileCount--;
LogUtil.error("压紧轴 已经停止运动但不在原点,重新回原点,剩余重新运动次数" + StoreMove.CanWhileCount);
ShuoKeControls.HomeMove(wait.SlvAddr);
}
}
}
else
{
bool isend = ShuoKeControls.IsMoveEnd(wait.SlvAddr, wait.TargetPosition, StoreMove.LastSetpTime, out msg);
if (isend)
{
bool isCheckOk = (MeteringSignal.TragetChangeCount <= MeteringSignal.SignalChangeCount);
if (isCheckOk || MeteringSignal.TragetChangeCount <= 0)
{
MeteringSignal.StopCheck();
return true;
}
else
{
msg = "压紧轴计量检测目标【" + MeteringSignal.TragetChangeCount + "】实际【" + MeteringSignal.SignalChangeCount + "】";
LogUtil.error("压紧轴已经停止运动,但是 " + msg);
return false ;
}
}
}
return false;
}
#endregion
#region 入库
......@@ -278,7 +231,7 @@ namespace OnlineStore.DeviceLibrary
LogUtil.error(LOGGER, StoreName + " 启动入库【" + posId + "】出错,找不到库位信息");
return;
}
if (KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
LogUtil.error(LOGGER, StoreName + " 启动入库【" + posId + "】出错,叉子料盘检测有料");
return;
......@@ -367,7 +320,7 @@ namespace OnlineStore.DeviceLibrary
{
InStoreLog("入库:SI_03 所有轴回到待机点,轴2、轴1 动作到P1,,轴4动作至P3");
StoreMove.NextMoveStep(StoreMoveStep.SI_03_ReturnHome);
ComMoveToPosition(moveP.ComPress_P3);
ComMoveToPosition(moveP.ComPress_P3,Config.CompAxis_P3_Speed);
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P3);
......@@ -382,7 +335,7 @@ namespace OnlineStore.DeviceLibrary
{
InStoreLog("入库:SI_04_CompressWare 压紧物品(有压紧轴的才需要此步骤),压紧轴至P3(压紧前点) 开始");
StoreMove.NextMoveStep(StoreMoveStep.SI_04_CompressWare);
ComMoveToPosition(moveP.ComPress_P3);
ComMoveToPosition(moveP.ComPress_P3,Config.CompAxis_P3_Speed);
//ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P3);
//StoreMove.WaitList.Add(WaitResultInfo.WaitShuoKe(Config.CompressAxis_Slv, moveP.ComPress_P3, false));
}
......@@ -403,7 +356,7 @@ namespace OnlineStore.DeviceLibrary
NeedCheckSafetyLight = 0;
InStoreLog("入库:SI_06 拿物品,压紧轴至P2(压紧点)) 升降轴至P7(进料口取料缓冲点) ");
StoreMove.NextMoveStep(StoreMoveStep.SI_06_DoorWarToDevice);
ComMoveToPosition(moveP.ComPress_P2,true);
ComMoveToPosition(moveP.ComPress_P2,Config.CompAxis_P2_Speed);
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P2);
......@@ -429,8 +382,8 @@ namespace OnlineStore.DeviceLibrary
ACAxisMove(Config.Middle_Axis, moveP.Middle_P2, Config.MiddleAxis_P2_Speed);
ACAxisMove(Config.UpDown_Axis, moveP.UpDown_P3, Config.UpDownAxis_P3_Speed);
//关闭舱门
KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
}
else
{
......@@ -446,8 +399,8 @@ namespace OnlineStore.DeviceLibrary
ACAxisMove(Config.Middle_Axis, moveP.Middle_P2, Config.MiddleAxis_P1_Speed);
ACAxisMove(Config.UpDown_Axis, moveP.UpDown_P3, Config.UpDownAxis_P3_Speed);
//关闭舱门
KNDIOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
KNDIOMove(IO_Type.Door_Up, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.Door_Down, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.Door_Up, IO_VALUE.LOW);
}
else if (StoreMove.MoveStep == StoreMoveStep.SI_09_MoveToBag)
{
......@@ -466,7 +419,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (StoreMove.MoveStep == StoreMoveStep.SI_10_LocationCylinder_Down)
{
//KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
//IOManager.IOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
InStoreLog("入库:SI_11 叉子进入库位中,进出轴至P3(库位取放料点) ");
StoreMove.NextMoveStep(StoreMoveStep.SI_11_DeviceToBag);
ACAxisMove(Config.InOut_Axis, moveP.InOut_P3, Config.InOutAxis_P3_Speed);
......@@ -484,7 +437,7 @@ namespace OnlineStore.DeviceLibrary
//SendLineStatus(StoreID, posId, StoreStatus.InStoreEnd);
StoreMove.NextMoveStep(StoreMoveStep.SI_12_PutWareToBag);
ComMoveToPosition(moveP.ComPress_P3, true);
ComMoveToPosition(moveP.ComPress_P3, Config.CompAxis_P3_Speed);
ACAxisMove(Config.UpDown_Axis, moveP.UpDown_P4, Config.UpDownAxis_P4_Speed);
}
......@@ -499,7 +452,7 @@ namespace OnlineStore.DeviceLibrary
{
InStoreLog("入库:SI_14 返回待机点,轴2/轴1/轴4动作至P1(待机点)),检测门关闭");
StoreMove.NextMoveStep(StoreMoveStep.SI_14_GoBack);
ComMoveToPosition(moveP.ComPress_P1);
ComMoveToPosition(moveP.ComPress_P1,Config.CompAxis_P1_Speed);
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P1);
......@@ -547,7 +500,7 @@ namespace OnlineStore.DeviceLibrary
LogUtil.error(LOGGER, StoreName + " 启动出库【" + posId + "】出错,找不到库位信息");
return false ;
}
if (KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
if (IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
LogUtil.error(LOGGER, StoreName + " 启动出库【" + posId + "】出错,叉子料盘检测有料");
return false ;
......@@ -600,7 +553,7 @@ namespace OnlineStore.DeviceLibrary
{
StoreMove.NextMoveStep(StoreMoveStep.SO_03_ToBagPosition);
OutStoreLog("出库:SO_03 走到库位,压紧轴至P3(压紧前点) ,旋转轴至P2(库位点),升降轴至P5(库位出库前点)");
ComMoveToPosition(moveP.ComPress_P3);
ComMoveToPosition(moveP.ComPress_P3,Config.CompAxis_P3_Speed);
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P3);
......@@ -619,18 +572,10 @@ namespace OnlineStore.DeviceLibrary
{
OutStoreLog("出库:SO_05 拿起物品,升降轴至P6(库位出料缓冲点),压紧轴至P2(压紧点) ");
StoreMove.NextMoveStep(StoreMoveStep.SO_05_BagWareToDevice);
//如果是7*32的料格,升降轴先上升,压紧轴再运动
//if (StoreMove.MoveParam.GetACPosition().BagHigh.Equals(32) && StoreMove.MoveParam.GetACPosition().BagWidth.Equals(7))
//{
// ACAxisMove(Config.UpDown_Axis, moveP.UpDown_P6, Config.UpDownAxis_P6_Speed);
// ComMoveToPosition(moveP.ComPress_P2, true);
//}
//else
//{
ComMoveToPosition(moveP.ComPress_P2, true);
ComMoveToPosition(moveP.ComPress_P2, Config.CompAxis_P2_Speed);
ACAxisMove(Config.UpDown_Axis, moveP.UpDown_P6, Config.UpDownAxis_P6_Speed);
//}
}
}
else if (StoreMove.MoveStep == StoreMoveStep.SO_05_BagWareToDevice)
{
StoreMove.NextMoveStep(StoreMoveStep.SO_06_BagDeviceBack);
......@@ -646,7 +591,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (StoreMove.MoveStep == StoreMoveStep.SO_06_BagDeviceBack)
{
if (KNDIOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
if (IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
{
string posId = StoreMove.MoveParam != null ? StoreMove.MoveParam.PositionNum : "";
CodeMsg = "出库[" + posId + "]叉子从库位退出后,未检测到料盘有料";
......@@ -719,7 +664,7 @@ namespace OnlineStore.DeviceLibrary
OutStoreLog("出库:SO_11 放下物品,升降轴至P8(进料口出料缓冲点) ");
StoreMove.NextMoveStep(StoreMoveStep.SO_11_DevicePutWare);
NeedCheckSafetyLight = 0;
ComMoveToPosition(moveP.ComPress_P1,true);
ComMoveToPosition(moveP.ComPress_P1,Config.CompAxis_P1_Speed);
//if (IsHasCompress_Axis)
//{
// ShuoKeControls.AbsMove(Config.CompressAxis_Slv, moveP.ComPress_P1);
......@@ -786,39 +731,39 @@ namespace OnlineStore.DeviceLibrary
{
return true;
}
if (KNDIOValue(IO_Type.LocationCylinder_Down).Equals(IO_VALUE.HIGH)
&& KNDIOValue(IO_Type.LocationCylinder_Up).Equals(IO_VALUE.LOW)
&& KNDIOValue(IO_Type.LocationCylinder2_Down).Equals(IO_VALUE.HIGH)
&& KNDIOValue(IO_Type.LocationCylinder2_Up).Equals(IO_VALUE.LOW))
{
return true;
}
return false;
return true;
//if (IOManager.IOValue(IO_Type.LocationCylinder_Down).Equals(IO_VALUE.HIGH)
// && IOManager.IOValue(IO_Type.LocationCylinder_Up).Equals(IO_VALUE.LOW)
// && IOManager.IOValue(IO_Type.LocationCylinder2_Down).Equals(IO_VALUE.HIGH)
// && IOManager.IOValue(IO_Type.LocationCylinder2_Up).Equals(IO_VALUE.LOW))
//{
// return true;
//}
//return false;
}
private void LocationUpAndWait()
{
if (Config.IsHasLocationCylinder>=1)
{
KNDIOMove(IO_Type.LocationCylinder_Up, IO_VALUE.HIGH);
KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Up, IO_VALUE.HIGH));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Down, IO_VALUE.LOW));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Up, IO_VALUE.HIGH));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Down, IO_VALUE.LOW));
}
//if (Config.IsHasLocationCylinder>=1)
//{
// IOManager.IOMove(IO_Type.LocationCylinder_Up, IO_VALUE.HIGH);
// IOManager.IOMove(IO_Type.LocationCylinder_Down, IO_VALUE.LOW);
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Up, IO_VALUE.HIGH));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Down, IO_VALUE.LOW));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Up, IO_VALUE.HIGH));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Down, IO_VALUE.LOW));
//}
}
private void LocationDownAndWait()
{
if (Config.IsHasLocationCylinder>=1)
{
KNDIOMove(IO_Type.LocationCylinder_Down, IO_VALUE.HIGH);
KNDIOMove(IO_Type.LocationCylinder_Up, IO_VALUE.LOW);
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Down, IO_VALUE.HIGH));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Up, IO_VALUE.LOW));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Down, IO_VALUE.HIGH));
StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Up, IO_VALUE.LOW));
}
//if (Config.IsHasLocationCylinder>=1)
//{
// IOManager.IOMove(IO_Type.LocationCylinder_Down, IO_VALUE.HIGH);
// IOManager.IOMove(IO_Type.LocationCylinder_Up, IO_VALUE.LOW);
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Down, IO_VALUE.HIGH));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder_Up, IO_VALUE.LOW));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Down, IO_VALUE.HIGH));
// StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LocationCylinder2_Up, IO_VALUE.LOW));
//}
}
#endregion
public List<FixtureCodeInfo> waitOutStoreList = new List<FixtureCodeInfo>();
......
......@@ -27,25 +27,7 @@ namespace OnlineStore.DeviceLibrary
public static bool IsConnectServer = !ConfigAppSettings.GetValue(Setting_Init.http_server).Equals("");
public StoreManager()
{
}
public static bool OpenShuoKe(AC_SA_BoxBean box)
{
//打开硕科步进驱动器端口
Parity parity = (Parity)box.Config.CompressAxis_PortParity;
StopBits bit = (StopBits)box.Config.CompressAxis_StopBits;
bool result = ShuoKeControls.InitPort(box.Config.CompressAxis_PortName, box.Config.CompressAxis_PortBaudrate,
box.Config.CompressAxis_PortParity, 8, bit);
if (result)
{
LogUtil.info(box.StoreName + "打开硕科步进控制器【" + box.Config.CompressAxis_PortName + "】成功");
return true;
}
else
{
LogUtil.error(box.StoreName + "打开硕科步进控制器【" + box.Config.CompressAxis_PortName + "】失败,启动失败!");
return false;
}
}
}
public static void CheckEnum(Type type)
{
if (type.IsEnum)
......
......@@ -52,7 +52,7 @@
<Compile Include="storeConfig\ConfigProAttribute.cs" />
<Compile Include="storeConfig\config\AC_SA_Config.cs" />
<Compile Include="storeConfig\config\StoreType.cs" />
<Compile Include="storeConfig\config\Store_IO_Type.cs" />
<Compile Include="storeConfig\config\IO_Type.cs" />
<Compile Include="CSVAttribute.cs" />
<Compile Include="storeConfig\CSVConfigReader.cs" />
<Compile Include="position\CSVPositionReader.cs" />
......
......@@ -64,7 +64,7 @@ namespace OnlineStore.LoadCSVLibrary
{
if (String.IsNullOrEmpty(ProType) || String.IsNullOrEmpty(ProName) || String.IsNullOrEmpty(ProVale))
{
throw new CVSFieldNotMatchingExection(ToString() + ",【类型:ProType】【名称:ProName】【属性值:ProVale】必须配置值!");
throw new CVSFieldNotMatchingExection("["+ToString() + "],【类型:ProType】【名称:ProName】【属性值:ProVale】必须配置值!");
}
}
}
......@@ -253,7 +253,13 @@ namespace OnlineStore.LoadCSVLibrary
{
return GetIOValue();
}
public string IO_IP
{
get
{
return DeviceName;
}
}
public int GetIOValue()
{
if (IoValue >= -1)
......
......@@ -370,62 +370,6 @@ namespace OnlineStore.LoadCSVLibrary
public ConfigMoveAxis InOut_Axis { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制端口号 CompressAxis_PortName COM4
/// </summary>
[ConfigProAttribute("CompressAxis_PortName")]
public string CompressAxis_PortName { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制波特率 CompressAxis_PortBaudrate 9600
/// </summary>
[ConfigProAttribute("CompressAxis_PortBaudrate")]
public int CompressAxis_PortBaudrate { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制奇偶校验 CompressAxis_PortParity 2
/// </summary>
[ConfigProAttribute("CompressAxis_PortParity")]
public int CompressAxis_PortParity { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制停止位 CompressAxis_StopBits 1
/// </summary>
[ConfigProAttribute("CompressAxis_StopBits")]
public int CompressAxis_StopBits { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制初速度 CompressAxis_StartSpeed 100
/// </summary>
[ConfigProAttribute("CompressAxis_StartSpeed")]
public int CompressAxis_StartSpeed { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制最大速度 CompressAxis_MaxSpeed 10000
/// </summary>
[ConfigProAttribute("CompressAxis_MaxSpeed")]
public int CompressAxis_MaxSpeed { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制末速度 CompressAxis_EndSpeed 10000
/// </summary>
[ConfigProAttribute("CompressAxis_EndSpeed")]
public int CompressAxis_EndSpeed { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制加速度 CompressAxis_AddSpeed 5000
/// </summary>
[ConfigProAttribute("CompressAxis_AddSpeed")]
public int CompressAxis_AddSpeed { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制减速度 CompressAxis_DelSpeed 1000
/// </summary>
[ConfigProAttribute("CompressAxis_DelSpeed")]
public int CompressAxis_DelSpeed { get; set; }
/// <summary>
/// PRO 硕科步进电机(压紧轴)控制归零速度(原点返回速度) CompressAxis_HomeSpeed 10000
/// </summary>
[ConfigProAttribute("CompressAxis_HomeSpeed")]
public int CompressAxis_HomeSpeed { get; set; }
/// <summary>
/// PRO,硕科步进电机轴地址(压紧轴),CompressAxis_Slv,1,,,,,,
/// </summary>
[ConfigProAttribute("CompressAxis_Slv")]
public int CompressAxis_Slv { get; set; }
/// <summary>
/// PRO (轴一)旋转轴最小限位 MiddleAxis_PositionMin
/// </summary>
[ConfigProAttribute("MiddleAxis_PositionMin", false)]
......@@ -544,7 +488,78 @@ namespace OnlineStore.LoadCSVLibrary
/// </summary>
[ConfigProAttribute("Default_TrayWidth", false)]
public int Default_TrayWidth { get; set; }
/// <summary>
/// 轴3压紧轴
/// </summary>
[ConfigProAttribute("Comp_Axis")]
public ConfigMoveAxis Comp_Axis { get; set; }
/// <summary>
/// PRO (轴四)压紧轴目标速度 CompAxis_TargetSpeed 100
/// </summary>
[ConfigProAttribute("CompAxis_TargetSpeed")]
public int CompAxis_TargetSpeed { get; set; }
/// <summary>
/// PRO (轴四)压紧轴加速度 CompAxis_AddSpeed 300
/// </summary>
[ConfigProAttribute("CompAxis_AddSpeed")]
public short CompAxis_AddSpeed { get; set; }
/// <summary>
/// PRO (轴四)压紧轴减速度 CompAxis_DelSpeed 300
/// </summary>
[ConfigProAttribute("CompAxis_DelSpeed")]
public short CompAxis_DelSpeed { get; set; }
/// <summary>
/// PRO (轴四)压紧轴原点低速 CompAxis_HomeLowSpeed 20
/// </summary>
[ConfigProAttribute("CompAxis_HomeLowSpeed")]
public int CompAxis_HomeLowSpeed { get; set; }
/// <summary>
/// PRO (轴四)压紧轴原点高速 CompAxis_HomeHighSpeed 60
/// </summary>
[ConfigProAttribute("CompAxis_HomeHighSpeed")]
public int CompAxis_HomeHighSpeed { get; set; }
/// <summary>
/// PRO (轴四)压紧轴原点加速度 CompAxis_HomeAddSpeed 200
/// </summary>
[ConfigProAttribute("CompAxis_HomeAddSpeed")]
public int CompAxis_HomeAddSpeed { get; set; }
/// <summary>
/// PRO 压紧轴(轴4)P1速度 CompAxis_P1_Speed 100
/// </summary>
[ConfigProAttribute("CompAxis_P1_Speed")]
public int CompAxis_P1_Speed { get; set; }
/// <summary>
/// PRO 压紧轴(轴4)P2速度 CompAxis_P2_Speed 100
/// </summary>
[ConfigProAttribute("CompAxis_P2_Speed")]
public int CompAxis_P2_Speed { get; set; }
/// <summary>
///PRO 压紧轴(轴4)P3速度 CompAxis_P3_Speed 100
/// </summary>
[ConfigProAttribute("CompAxis_P3_Speed")]
public int CompAxis_P3_Speed { get; set; }
/// <summary>
/// PRO IO模块对应的DI数量 IO_DILength 192.168.200.10#16;192.168.200.11#4
/// </summary>
[ConfigProAttribute("IO_DILength")]
public string IO_DILength { get; set; }
/// <summary>
/// PRO 模块对应的DO数量 IO_DOLength 192.168.200.10#16;192.168.200.11#4
/// </summary>
[ConfigProAttribute("IO_DOLength")]
public string IO_DOLength { get; set; }
/// <summary>
/// PRO,模拟转换系数,AI_ConvertPosition,55,,,,,,,
/// /// </summary>
[ConfigProAttribute("AI_ConvertPosition")]
public int AI_ConvertPosition { get; set; }
private Dictionary<string, string> CodeSizeMap =null ;
private static char codeSpilt= '#';
......@@ -600,32 +615,23 @@ namespace OnlineStore.LoadCSVLibrary
MustHaveDIList.Add(IO_Type.Door_Up);
MustHaveDIList.Add(IO_Type.Door_Down);
MustHaveDIList.Add(IO_Type.Door_LimitSingle);
MustHaveDIList.Add(IO_Type.SafetyLightCurtains);
MustHaveDIList.Add(IO_Type.CompressAxis_Check);
//MustHaveDIList.Add(IO_Type.LocationCylinder_Down);
//MustHaveDIList.Add(IO_Type.LocationCylinder_Up);
//MustHaveDIList.Add(IO_Type.LocationCylinder2_Down);
//MustHaveDIList.Add(IO_Type.LocationCylinder2_Up);
//MustHaveDIList.Add(IO_Type.Left_Door_LimitSingle);
//MustHaveDIList.Add(IO_Type.Right_Door_LimitSingle);
//MustHaveDIList.Add(IO_Type.TrayCheck_3);
//MustHaveDIList.Add(IO_Type.TrayCheck_4);
//MustHaveDIList.Add(IO_Type.LocationCylinder2_Down);
//MustHaveDIList.Add(IO_Type.LocationCylinder2_Up);
MustHaveDIList.Add(IO_Type.SafetyLightCurtains);
MustHaveDIList.Add(IO_Type.Door_Limit);
MustHaveDIList.Add(IO_Type.Door_LeftLimit);
MustHaveDIList.Add(IO_Type.Door_RightLimit);
MustHaveDOList.Add(IO_Type.AutoRun_HddLed);
MustHaveDOList.Add(IO_Type.Alarm_HddLed);
MustHaveDOList.Add(IO_Type.RunSign_HddLed);
MustHaveDOList.Add(IO_Type.Alarm_Buzzer);
MustHaveDOList.Add(IO_Type.StartOrStopBlow);
MustHaveDOList.Add(IO_Type.Run_Signal);
MustHaveDOList.Add(IO_Type.Door_Up);
MustHaveDOList.Add(IO_Type.Door_Down);
//MustHaveDOList.Add(IO_Type.LocationCylinder_Down);
//MustHaveDOList.Add(IO_Type.LocationCylinder_Up);
MustHaveDOList.Add(IO_Type.Axis_Brake);
MustHaveDOList.Add(IO_Type.CameraLight_Power);
MustHaveDOList.Add(IO_Type.Door_Up);
MustHaveDOList.Add(IO_Type.Door_Down);
MustHaveDOList.Add(IO_Type.Camera_Led);
}
public static void ConfigAxis(AC_SA_Config Config)
{
......@@ -650,6 +656,13 @@ namespace OnlineStore.LoadCSVLibrary
Config.UpDown_Axis.HomeHighSpeed = Config.UpdownAxis_HomeHighSpeed;
Config.UpDown_Axis.HomeLowSpeed = Config.UpdownAxis_HomeLowSpeed;
Config.Comp_Axis.TargetSpeed = Config.CompAxis_TargetSpeed;
Config.Comp_Axis.AddSpeed = Config.CompAxis_AddSpeed;
Config.Comp_Axis.DelSpeed = Config.CompAxis_DelSpeed;
Config.Comp_Axis.HomeAddSpeed = Config.CompAxis_HomeAddSpeed;
Config.Comp_Axis.HomeHighSpeed = Config.CompAxis_HomeHighSpeed;
Config.Comp_Axis.HomeLowSpeed = Config.CompAxis_HomeLowSpeed;
Config.Middle_Axis.CanErrorCountMin = Config.MiddleAxis_ErrorCountMin;
Config.InOut_Axis.CanErrorCountMin = Config.InoutAxis_ErrorCountMin;
Config.UpDown_Axis.CanErrorCountMin = Config.UpdownAxis_ErrorCountMin;
......@@ -672,6 +685,74 @@ namespace OnlineStore.LoadCSVLibrary
Config.Middle_Axis.DefaultPosition = Config.MiddleAxis_P1_Position;
Config.InOut_Axis.DefaultPosition = Config.InOutAxis_P1_Position;
Config.UpDown_Axis.DefaultPosition = Config.UpDownAxis_DoorOPosition_P1;
Config.Comp_Axis.DefaultPosition = Config.CompressAxis_P1_Position;
Config.Comp_Axis.CanErrorCountMax = 1000;
Config.Comp_Axis.CanErrorCountMin = 10;
Config.Comp_Axis.PositionMin = 0;
Config.Comp_Axis.PositionMax = 0;
}
private Dictionary<string, ushort> DILengthMap = null;
private Dictionary<string, ushort> DOLengthMap = null;
public ushort GetDILength(string ip)
{
try
{
if (DILengthMap == null)
{
DILengthMap = new Dictionary<string, ushort>();
string[] arrayList = IO_DILength.Split(';');
foreach (string str in arrayList)
{
string[] arrStr = str.Split('#');
if (arrStr.Length == 2)
{
string ioip = arrStr[0];
ushort length = Convert.ToUInt16(arrStr[1]);
DILengthMap.Add(ioip, length);
}
}
}
}
catch (Exception ex)
{
}
if (DILengthMap.ContainsKey(ip))
{
return DILengthMap[ip];
}
return 16;
}
public ushort GetDOLength(string ip)
{
try
{
if (DOLengthMap == null)
{
DOLengthMap = new Dictionary<string, ushort>();
string[] arrayList = IO_DOLength.Split(';');
foreach (string str in arrayList)
{
string[] arrStr = str.Split('#');
if (arrStr.Length == 2)
{
string ioip = arrStr[0];
ushort length = Convert.ToUInt16(arrStr[1]);
DOLengthMap.Add(ioip, length);
}
}
}
}
catch (Exception ex)
{
}
if (DOLengthMap.ContainsKey(ip))
{
return DOLengthMap[ip];
}
return 16;
}
}
}
......@@ -25,120 +25,94 @@ namespace OnlineStore.LoadCSVLibrary
}
return TypeList;
}
/// <summary>
/// 料仓,DI 急停 SuddenStop_BTN X01 DI-01
/// DI 急停 SuddenStop_BTN X01
/// </summary>
public static string SuddenStop_BTN = "SuddenStop_BTN";
/// <summary>
/// 料仓 DI 复位 Reset_BTN X02 DI-02
/// DI 复位 Reset_BTN X02
/// </summary>
public static string Reset_BTN = "Reset_BTN";
/// <summary>
///DI 自动运行 AutoRun_Signal
///DI 自动 AutoRun_Signal X03
/// </summary>
public static string AutoRun_Signal = "AutoRun_Signal";
/// <summary>
/// 料仓DI。气压检测(料仓) Airpressure_Check
///DI 气压检测 Airpressure_Check X04
/// </summary>
public static string Airpressure_Check = "Airpressure_Check";
/// <summary>
/// DI 料仓门口料盘检测 TrayCheck_1
/// DI 料盘检测1(进料口) TrayCheck_Door X05
/// </summary>
public static string TrayCheck_Door = "TrayCheck_Door";
/// <summary>
/// DI 叉子料盘检测 TrayCheck_Fixture
/// DI 料盘检测2(料叉) TrayCheck_Fixture X06
/// </summary>
public static string TrayCheck_Fixture = "TrayCheck_Fixture";
/// <summary>
/// 料仓IO。定位气缸上升端(料仓) LocationCylinder_Up
/// </summary>
public static string LocationCylinder_Up = "LocationCylinder_Up";
/// <summary>
///料仓IO。 定位气缸下降端(料仓) LocationCylinder_Down
/// </summary>
public static string LocationCylinder_Down = "LocationCylinder_Down";
/// <summary>
/// 料仓IO。定位气缸上升端(料仓) LocationCylinder2_Up
/// </summary>
public static string LocationCylinder2_Up = "LocationCylinder2_Up";
/// DI 进料口门上升端 Door_Up X07
/// </summary>
public static string Door_Up = "Door_Up";
/// <summary>
///料仓IO。 定位气缸下降端(料仓) LocationCylinder2_Down
/// </summary>
public static string LocationCylinder2_Down = "LocationCylinder2_Down";
/// DI 进料口门下降端 Door_Down X08
/// </summary>
public static string Door_Down = "Door_Down";
/// <summary>
/// 料仓DO 。料仓运转ON Run_Signal
/// </summary>
public static string Run_Signal = "Run_Signal";
/// DI 安全光栅 SafetyLightCurtains X09
/// </summary>
public static string SafetyLightCurtains = "SafetyLightCurtains";
/// <summary>
/// 料仓DO 。料仓轴2刹车ON Axis_Brake
/// </summary>
public static string Axis_Brake = "Axis_Brake";
/// DI 前门限位 Door_Limit X10
/// </summary>
public static string Door_Limit = "Door_Limit";
/// <summary>
/// 料仓DO 。料仓吹气SOL ON StartOrStopBlow
/// </summary>
public static string StartOrStopBlow = "StartOrStopBlow";
/// DI 左侧门限位 Door_LeftLimit X11
/// </summary>
public static string Door_LeftLimit = "Door_LeftLimit";
/// <summary>
/// DO 自动指示灯 AutoRun_HddLed
/// </summary>
public static string AutoRun_HddLed = "AutoRun_HddLed";
/// DI 右侧门限位 Door_RightLimit X12
/// </summary>
public static string Door_RightLimit = "Door_RightLimit";
/// <summary>
/// DO 待机指示灯 RunSign_HddLed
/// DO 自动指示灯 AutoRun_HddLed Y01
/// </summary>
public static string RunSign_HddLed = "RunSign_HddLed";
public static string AutoRun_HddLed = "AutoRun_HddLed";
/// <summary>
///DO 故障指示灯 Alarm_HddLed
///DO 故障指示灯 Alarm_HddLed Y02
/// </summary>
public static string Alarm_HddLed = "Alarm_HddLed";
/// <summary>
/// 吹气SOL Blow_Single
/// </summary>
public static string Blow_Single = "Blow_Single";
/// <summary>
/// 进出料口门上升端 Door_Up
/// </summary>
public static string Door_Up = "Door_Up";
/// <summary>
/// 进出料口门下降端 Door_Down
/// </summary>
public static string Door_Down = "Door_Down";
/// <summary>
/// 左侧门限位
/// DO 待机指示灯 RunSign_HddLed Y03
/// </summary>
public static string Left_Door_LimitSingle = "Left_Door_LimitSingle";
public static string RunSign_HddLed = "RunSign_HddLed";
/// <summary>
/// 右侧门限位
/// DO 故障蜂鸣器 Alarm_Buzzer Y04
/// </summary>
public static string Right_Door_LimitSingle = "Right_Door_LimitSingle";
public static string Alarm_Buzzer = "Alarm_Buzzer";
/// <summary>
/// 前门限位
/// DO 吹气SOL ON StartOrStopBlow Y05
/// </summary>
public static string Door_LimitSingle = "Door_LimitSingle";
public static string StartOrStopBlow = "StartOrStopBlow";
/// <summary>
/// 安全光栅
/// DO 料仓运转ON Run_Signal Y06
/// </summary>
public static string SafetyLightCurtains = "SafetyLightCurtains";
public static string Run_Signal = "Run_Signal";
/// <summary>
/// 摄像机光源
/// DO 轴2刹车电源ON Axis_Brake Y07
/// </summary>
public static string CameraLight_Power = "CameraLight_Power";
public static string Axis_Brake = "Axis_Brake";
/// <summary>
/// 压紧机构计量检测 CompressAxis_Check X16 DI-16
/// DO 相机照明开 Camera_Led Y10
/// </summary>
public static string CompressAxis_Check = "CompressAxis_Check";
public static string Camera_Led = "Camera_Led";
}
public enum IO_VALUE
{
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!