Commit e8bad718 LN

IOdll更新为佳世达四楼用的版本。

1 个父辈 ba23a99d
...@@ -6,94 +6,52 @@ ...@@ -6,94 +6,52 @@
<members> <members>
<member name="T:Asa.IOModule.AIOBOX"> <member name="T:Asa.IOModule.AIOBOX">
<summary> <summary>
AIOBOX操作类 零点IO模块操作类
</summary> </summary>
</member> </member>
<member name="F:Asa.IOModule.AIOBOX.suspend"> <member name="T:Asa.IOModule.AIOBOX.DIO_Changed">
<summary> <summary>
暂停次数 自动读取DIO委托
WriteDO 命令非常多时,暂停一次发送 ReadDI 或 ReadDO
</summary>
</member>
<member name="F:Asa.IOModule.AIOBOX.SEND_SLEEP">
<summary>
每条命令发送的间隔
不能小于15,会出现IO接收不到的情况
小于30时,会出现接收数据连包的情况
</summary>
</member>
<member name="F:Asa.IOModule.AIOBOX.NET_SLEEP">
<summary>
监听网络接收数据的间隔
必须小于SEND_SLEEP
</summary>
</member>
<member name="F:Asa.IOModule.AIOBOX.TRIG_SLEEP">
<summary>
触发DIO状态事件的间隔
</summary> </summary>
<param name="box">AIOBOX</param>
<param name="sta"></param>
</member> </member>
<member name="T:Asa.IOModule.AIOBOX.DI_Changed"> <member name="T:Asa.IOModule.AIOBOX.AIO_Changed">
<summary> <summary>
自动读取DI委托 自动读取AIO委托
</summary> </summary>
<param name="box">AIOBOX</param> <param name="box">AIOBOX</param>
<param name="sta">所有DI状态</param> <param name="val"></param>
</member> </member>
<member name="E:Asa.IOModule.AIOBOX.DI_Changed_Event"> <member name="E:Asa.IOModule.AIOBOX.DI_Changed_Event">
<summary> <summary>
自动读取DI事件触发 自动读取DI事件触发
</summary> </summary>
</member> </member>
<member name="T:Asa.IOModule.AIOBOX.DO_Changed">
<summary>
自动读取DO委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DO状态</param>
</member>
<member name="E:Asa.IOModule.AIOBOX.DO_Changed_Event"> <member name="E:Asa.IOModule.AIOBOX.DO_Changed_Event">
<summary> <summary>
自动读取DO事件触发 自动读取DO事件触发
</summary> </summary>
</member> </member>
<member name="T:Asa.IOModule.AIOBOX.AI_Changed">
<summary>
自动读取AI委托
</summary>
<param name="box">AIOBOX</param>
<param name="val">所有AI的值</param>
</member>
<member name="E:Asa.IOModule.AIOBOX.AI_Changed_Event"> <member name="E:Asa.IOModule.AIOBOX.AI_Changed_Event">
<summary> <summary>
自动读取AI事件触发 自动读取AI事件触发
</summary> </summary>
</member> </member>
<member name="T:Asa.IOModule.AIOBOX.AO_Changed"> <member name="M:Asa.IOModule.AIOBOX.#ctor(System.String)">
<summary>
自动读取AO委托
</summary>
<param name="box">AIOBOX</param>
<param name="val">所有AO的值</param>
</member>
<member name="E:Asa.IOModule.AIOBOX.AO_Changed_Event">
<summary> <summary>
自动读取AO事件触发 零点IO模块操作类
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.#ctor">
<summary>
AIOBOX
</summary> </summary>
<param name="logName"></param>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.IP"> <member name="P:Asa.IOModule.AIOBOX.IP">
<summary> <summary>
IP地址 IP地址
</summary> </summary>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.Port"> <member name="P:Asa.IOModule.AIOBOX.Upload">
<summary> <summary>
ModBus端口 输入主动上传
</summary> </summary>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.IsConn"> <member name="P:Asa.IOModule.AIOBOX.IsConn">
...@@ -101,61 +59,24 @@ ...@@ -101,61 +59,24 @@
是否连接 是否连接
</summary> </summary>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.ErrInfo">
<summary>
错误信息
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.LogOutDir">
<summary>
日志输出目录
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.LogOut">
<summary>
错误日志输出,默认true
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.InputCount"> <member name="P:Asa.IOModule.AIOBOX.InputCount">
<summary> <summary>
输入总数 DI总数
</summary> </summary>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.OutputCount"> <member name="P:Asa.IOModule.AIOBOX.OutputCount">
<summary> <summary>
输出总数 DO总数
</summary> </summary>
</member> </member>
<member name="P:Asa.IOModule.AIOBOX.InputReadSleep"> <member name="M:Asa.IOModule.AIOBOX.SetType(Asa.IOModule.Box_Type,System.Int32,Asa.IOModule.Box_Type,System.Int32)">
<summary> <summary>
自动读取DI间隔 设置输入输出的类型
</summary> </summary>
</member> <param name="input"></param>
<member name="P:Asa.IOModule.AIOBOX.OutputReadSleep"> <param name="inputCount"></param>
<summary> <param name="output"></param>
自动读取DO间隔 <param name="outputCount"></param>
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.SetInput(Asa.IOModule.Box_Type,System.Int32)">
<summary>
设置输入端
</summary>
<param name="type">类型</param>
<param name="count">数量</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.SetOutput(Asa.IOModule.Box_Type,System.Int32)">
<summary>
设置输出端
</summary>
<param name="type">类型</param>
<param name="count">数量</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoIP(System.String)">
<summary>
自动获取IP地址,未连接前使用,必须在同一网段
</summary>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Connect"> <member name="M:Asa.IOModule.AIOBOX.Connect">
<summary> <summary>
...@@ -168,26 +89,18 @@ ...@@ -168,26 +89,18 @@
关闭连接 关闭连接
</summary> </summary>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput(System.Boolean,System.Int32)"> <member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<summary>
自动读取输入端,触发事件
</summary>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于15ms</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput(System.Boolean,System.Int32)">
<summary> <summary>
自动读取输出端,触发事件 相反状态(ON/OFF)
</summary> </summary>
<param name="read">是否自动读取</param> <param name="sta"></param>
<param name="sleep">间隔,必须大于10ms</param> <returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)"> <member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta@)">
<summary> <summary>
相反状态(ON/OFF) 相反状态(ON/OFF)
</summary> </summary>
<param name="sta"></param> <param name="sta"></param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32)"> <member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32)">
<summary> <summary>
...@@ -265,65 +178,66 @@ ...@@ -265,65 +178,66 @@
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Send"> <member name="M:Asa.IOModule.AIOBOX.Send">
<summary> <summary>
发送命令 发送命令线程
</summary> </summary>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Receive"> <member name="M:Asa.IOModule.AIOBOX.GetReadDI_Command">
<summary> <summary>
接收命令 获取ReadDI的命令
</summary> </summary>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReadSingle(System.Byte[])"> <member name="M:Asa.IOModule.AIOBOX.GetReadDO_Command">
<summary> <summary>
读取写入单个DO,功能码5 获取ReadDO的命令
</summary> </summary>
<param name="buff"></param> <returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Byte[])"> <member name="M:Asa.IOModule.AIOBOX.Listen">
<summary> <summary>
读取所有DO状态,功能码1 监听网络线程
</summary> </summary>
<param name="buff"></param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Byte[])"> <member name="M:Asa.IOModule.AIOBOX.CommandProcess(System.Byte[])">
<summary> <summary>
读取所有DI状态,功能码2 接收到的命令处理方法,(task多线程)
</summary> </summary>
<returns></returns> <param name="cmd"></param>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Byte[])"> <member name="M:Asa.IOModule.AIOBOX.Reconn">
<summary> <summary>
读取所有AI的值,功能码4 重连线程
</summary> </summary>
<param name="buff"></param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Command"> <member name="M:Asa.IOModule.AIOBOX.Open">
<summary> <summary>
命令,前7个字节 打开socket建立连接
</summary> </summary>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.TriggerDIO"> <member name="M:Asa.IOModule.AIOBOX.CheckIP(System.String)">
<summary> <summary>
触发DIO改变事件 检查IP地址
</summary> </summary>
<param name="ip"></param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput"> <member name="M:Asa.IOModule.AIOBOX.AutoIP(System.String)">
<summary> <summary>
自动读取输入端线程 自动获取IP地址,未连接前使用,必须在同一网段
</summary> </summary>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput"> <member name="M:Asa.IOModule.AIOBOX.GetIP">
<summary> <summary>
自动读取输出端线程 获取IO模块IP地址
</summary> </summary>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Listen"> <member name="M:Asa.IOModule.AIOBOX.Command">
<summary> <summary>
监听结果线程 命令,前7个字节
</summary> </summary>
<returns></returns>
</member> </member>
<member name="T:Asa.IOModule.Box_Type"> <member name="T:Asa.IOModule.Box_Type">
<summary> <summary>
...@@ -365,248 +279,5 @@ ...@@ -365,248 +279,5 @@
闭合,打开,高电平 闭合,打开,高电平
</summary> </summary>
</member> </member>
<member name="T:Asa.IOModule.Reg">
<summary>
IO模块寄存器
</summary>
</member>
<member name="F:Asa.IOModule.Reg.ID">
<summary>
标识
</summary>
</member>
<member name="F:Asa.IOModule.Reg.Text">
<summary>
文本,仅用于显示
</summary>
</member>
<member name="F:Asa.IOModule.Reg.Address">
<summary>
寄存器地址
</summary>
</member>
<member name="F:Asa.IOModule.Reg.Status">
<summary>
当前的状态
</summary>
</member>
<member name="M:Asa.IOModule.Reg.#ctor(Asa.IOModule.Box_Addr)">
<summary>
寄存器,文本空,状态OFF
</summary>
<param name="address">地址</param>
</member>
<member name="M:Asa.IOModule.Reg.#ctor(System.String,Asa.IOModule.Box_Addr)">
<summary>
寄存器,状态OFF
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="M:Asa.IOModule.Reg.#ctor(System.Int32,System.String,Asa.IOModule.Box_Addr)">
<summary>
寄存器,状态OFF
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="M:Asa.IOModule.Reg.#ctor(System.String,Asa.IOModule.Box_Addr,Asa.IOModule.Box_Sta)">
<summary>
寄存器
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
<param name="status">状态</param>
</member>
<member name="M:Asa.IOModule.Reg.#ctor(System.Int32,System.String,Asa.IOModule.Box_Addr,Asa.IOModule.Box_Sta)">
<summary>
寄存器
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="address">地址</param>
<param name="status">状态</param>
</member>
<member name="T:Asa.IOModule.Box_Addr">
<summary>
IO模块寄存器地址
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_1">
<summary>
输入点,DI01
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_2">
<summary>
输入点,DI02
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_3">
<summary>
输入点,DI03
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_4">
<summary>
输入点,DI04
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_5">
<summary>
输入点,DI05
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_6">
<summary>
输入点,DI06
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_7">
<summary>
输入点,DI07
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_8">
<summary>
输入点,DI08
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_9">
<summary>
输入点,DI09
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_10">
<summary>
输入点,DI10
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_11">
<summary>
输入点,DI11
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_12">
<summary>
输入点,DI12
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_13">
<summary>
输入点,DI13
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_14">
<summary>
输入点,DI14
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_15">
<summary>
输入点,DI15
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DI_16">
<summary>
输入点,DI16
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_1">
<summary>
输出点,DO01
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_2">
<summary>
输出点,DO02
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_3">
<summary>
输出点,DO03
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_4">
<summary>
输出点,DO04
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_5">
<summary>
输出点,DO05
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_6">
<summary>
输出点,DO06
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_7">
<summary>
输出点,DO07
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_8">
<summary>
输出点,DO08
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_9">
<summary>
输出点,DO09
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_10">
<summary>
输出点,DO10
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_11">
<summary>
输出点,DO11
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_12">
<summary>
输出点,DO12
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_13">
<summary>
输出点,DO13
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_14">
<summary>
输出点,DO14
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_15">
<summary>
输出点,DO15
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.DO_16">
<summary>
输出点,DO16
</summary>
</member>
<member name="F:Asa.IOModule.Box_Addr.NONE">
<summary>
</summary>
</member>
<member name="T:Asa.IOModule.DI_Addr">
<summary>
输入端地址
</summary>
</member>
<member name="T:Asa.IOModule.DO_Addr">
<summary>
输入端地址
</summary>
</member>
</members> </members>
</doc> </doc>
...@@ -11,99 +11,40 @@ namespace OnlineStore.DeviceLibrary ...@@ -11,99 +11,40 @@ namespace OnlineStore.DeviceLibrary
{ {
public class AIOAIManager:AIManager public class AIOAIManager:AIManager
{ {
private object AILock = ""; private object AILock = "";
private List<int> AIValList = null;
private int AILength = 4; private int AILength = 4;
private Asa.IOModule.AIOBOX AIBox = null; private Asa.IOModule.AIOBOX AiBox = null;
private System.Timers.Timer conTimer = null;
private List<string> needConIp = new List<string>();
public override void StartConnect(params string[] ipList) public override void StartConnect(params string[] ipList)
{ {
if (conTimer == null)
{
conTimer = new System.Timers.Timer();
conTimer.AutoReset = true;
conTimer.Interval = 60000;
conTimer.Elapsed += ConTimer_Elapsed;
}
conTimer.Enabled = false;
needConIp = new List<string>(ipList);
foreach (string ip in ipList) foreach (string ip in ipList)
{ {
bool result = ConnectionIP(ip); bool result = ConnectionIP(ip);
} }
if (needConIp.Count > 0)
{
//启动定时器,1一分钟重连一次
conTimer.Start();
}
} }
private bool ConnectionIP(string ioIp) private bool ConnectionIP(string ioIp)
{ {
int autoMS = 150; int autoMS = 150;
try try
{ {
AIValList = new List<int>(); AiBox = new Asa.IOModule.AIOBOX();
AIBox = new Asa.IOModule.AIOBOX(); AiBox.IP = ioIp;
AIBox.IP = ioIp; AiBox.SetType(Asa.IOModule.Box_Type.AI, AILength, Box_Type.AO, 0);
// 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 + "],尝试重连三次"); LogUtil.debug("开始连接AI模块[" + ioIp + "][" + autoMS + "],尝试重连三次");
for (int i = 1; i <= 3; i++) bool result = AiBox.Connect();
{
bool result = AIBox.Connect();
if (result)
{
if (needConIp.Contains(ioIp))
{
needConIp.Remove(ioIp);
}
LogUtil.info("第【" + i + "】次连接IO模块[" + ioIp + "][" + autoMS + "]成功:" + AIBox.ErrInfo);
return true;
}
else
{
LogUtil.error("第【" + i + "】次连接IO模块[" + ioIp + "][" + autoMS + "]失败:" + AIBox.ErrInfo + "");
}
Thread.Sleep(10);
}
} }
catch (Exception error) catch (Exception error)
{ {
LogUtil.error("连接IO模块[" + ioIp + "][" + autoMS + "]出错:" + error.ToString()); LogUtil.error("连接IO模块[" + ioIp + "][" + autoMS + "]出错:" + error.ToString());
} }
return false; return false;
} }
private void ConTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
List<string> list = new List<string>(needConIp);
if (list.Count > 0)
{
foreach (string ip in list)
{
LogUtil.info("重连AOI AI 模块 :" + ip);
ConnectionIP(ip);
}
}
}
catch (Exception ex)
{
LogUtil.error("AOI AI ConTimer_Elapsed 出错: " + ex.ToString());
}
}
public override void CloseConnect() public override void CloseConnect()
{ {
try try
{ {
if (AIBox != null) if (AiBox != null)
{ {
AIBox.Close(); AiBox.Close();
} }
} }
catch (Exception ex) catch (Exception ex)
...@@ -112,49 +53,15 @@ namespace OnlineStore.DeviceLibrary ...@@ -112,49 +53,15 @@ namespace OnlineStore.DeviceLibrary
} }
} }
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) public override double GetAIValue(string ioiP, int index)
{ {
for (int i = 1; i <= 3; i++) if (AiBox != null)
{ {
try return AiBox.ReadAI(index);
{
if (AIValList != null && index >= 0 && AIValList.Count > index)
{
return AIValList[index];
}
}
catch (Exception ex)
{
if (i > 1)
{
LogUtil.error("GetAIValue第【" + i + "】次获取 " + ioiP + "_" + index + "出错:" + ex.ToString());
}
}
Thread.Sleep(1);
} }
return 0; return -1;
} }
} }
} }
...@@ -9,182 +9,122 @@ using OnlineStore.Common; ...@@ -9,182 +9,122 @@ using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary; using OnlineStore.LoadCSVLibrary;
using System.Threading.Tasks; using System.Threading.Tasks;
using Asa.IOModule; using Asa.IOModule;
using System.Collections.Concurrent; using System.Windows.Forms;
namespace OnlineStore.DeviceLibrary namespace OnlineStore.DeviceLibrary
{ {
public class AIOBOXManager : IOManager public class AIOBOXManager : IOManager
{ {
//public static uint DefaultDICount = 16;
//public static uint DefaultDOCount = 16;
public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>(); public Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>();
public ConcurrentDictionary<string, List<Box_Sta>> DIValueMap = new ConcurrentDictionary<string, List<Box_Sta>>(); public Dictionary<string, List<Box_Sta>> DIValueMap = new Dictionary<string, List<Box_Sta>>();
public ConcurrentDictionary<string, List<Box_Sta>> DOValueMap = new ConcurrentDictionary<string, List<Box_Sta>>(); public Dictionary<string, List<Box_Sta>> DOValueMap = new Dictionary<string, List<Box_Sta>>();
private object DIMapLock = ""; private object DIMapLock = "";
private object DOMapLock = ""; private object DOMapLock = "";
private object DILock = ""; private object DILock = "";
private object DOLock = ""; private object DOLock = "";
private List<string> IoIPLIst = new List<string>(); //private List<string> IoIPLIst = new List<string>();
private System.Timers.Timer conTimer = null; //private System.Timers.Timer conTimer = null;
public override void ConnectionIOList(List<string> DIONameList) public override void ConnectionIOList(List<string> DIONameList)
{ {
if (conTimer == null)
{
conTimer = new System.Timers.Timer();
conTimer.AutoReset = true;
conTimer.Interval = 60000;
conTimer.Elapsed += ConTimer_Elapsed;
}
conTimer.Enabled = false;
IoIPLIst = new List<string>(DIONameList);
foreach (string ip in DIONameList) foreach (string ip in DIONameList)
{ {
ConnectionIP(ip); ConnectionIP(ip);
} }
if (IoIPLIst.Count > 0)
{
//启动定时器,1一分钟重连一次
conTimer.Start();
}
}
private void ConTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
List<string> list = new List<string>(IoIPLIst);
if (list.Count > 0)
{
foreach (string ip in list)
{
LogUtil.info("重连AOI :" + ip);
ConnectionIP(ip);
}
}
}
catch (Exception ex)
{
LogUtil.error("AOI ConTimer_Elapsed 出错: " + ex.ToString());
}
} }
//private bool isProcess = false;
//private DateTime lastTime = DateTime.Now;
public void ConnectionIP(string ioIp) public void ConnectionIP(string ioIp)
{ {
AIOBOX aioBox = null; AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp)) if (AIOMap.ContainsKey(ioIp))
{ {
aioBox = AIOMap[ioIp]; aioBox = AIOMap[ioIp];
try
if (null != aioBox)
{ {
aioBox.Close(); if (null != aioBox)
aioBox = null; {
aioBox.Close();
aioBox = null;
}
}
catch (Exception ex)
{
LogUtil.error("关闭Io模块【" + ioIp + "】出错:" + ex.ToString());
} }
AIOMap.Remove(ioIp); AIOMap.Remove(ioIp);
} }
List<Box_Sta> list = new List<Box_Sta>();
if (DIValueMap.ContainsKey(ioIp)) if (DIValueMap.ContainsKey(ioIp))
{ {
DIValueMap.TryRemove(ioIp,out list); DIValueMap.Remove(ioIp);
} }
if (DOValueMap.ContainsKey(ioIp)) if (DOValueMap.ContainsKey(ioIp))
{ {
DOValueMap.TryRemove(ioIp, out list); DOValueMap.Remove(ioIp);
} }
int DIMS = ConfigAppSettings.GetIntValue("DIMS"); int DIMS = ConfigAppSettings.GetIntValue("DIMS");
if (DIMS < 20) if (DIMS <= 0)
{ {
DIMS = 20; DIMS = 150;
}
else if (DIMS < 20)
{
DIMS = 100;
} }
int DOMS = ConfigAppSettings.GetIntValue("DOMS"); int DOMS = ConfigAppSettings.GetIntValue("DOMS");
if (DOMS < 200) if (DOMS <= 0)
{
DOMS = 300;
}
else if (DOMS < 100)
{ {
DOMS = 200; DOMS = 300;
} }
int DILength = StoreManager.Config.GetDILength(ioIp); int DILength = StoreManager.Config.GetDILength(ioIp);
int DOLength = StoreManager.Config.GetDOLength(ioIp); int DOLength = StoreManager.Config.GetDOLength(ioIp);
string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "],[" + DIMS + "] [" + DOMS + "]"; string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "],[" + DIMS + "] [" + DOMS + "]";
try try
{ {
// Create new modbus master and add event functions
aioBox = new AIOBOX(); aioBox = new AIOBOX();
aioBox.SetType(Box_Type.DI, DILength, Box_Type.DO, DOLength);
aioBox.IP = ioIp; aioBox.IP = ioIp;
// bool rtn = aioBox.AutoIP(ioIp); aioBox.Upload = false;
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.DI_Changed_Event += AioBox_DI_Changed_Event; ;
aioBox.DO_Changed_Event += AioBox_DO_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.debug("开始连接" + logName + ",尝试重连5次"); bool conRes = aioBox.Connect();
for (int i = 1; i <= 3; i++) LogUtil.info("开始连接:" + logName + ":" + conRes.ToString());
{ AIOMap.Add(ioIp, aioBox);
bool result = aioBox.Connect(); Thread.Sleep(5);
if (result) //读取所有的DO
{ ReadAllDI(ioIp, 0);
LogUtil.info("第【" + i + "】次连接 " + logName + " 成功:" + aioBox.ErrInfo);
Thread.Sleep(10);
//读取所有的DO
ReadAllDI(ioIp, 0);
if (IoIPLIst.Contains(ioIp))
{
IoIPLIst.Remove(ioIp);
}
break;
}
else
{
LogUtil.error("第【" + i + "】次连接 " + logName + " 失败:" + aioBox.ErrInfo + "");
}
Thread.Sleep(2);
}
Thread.Sleep(5);
GC.Collect();
} }
catch (Exception error) catch (Exception error)
{ {
LogUtil.error(LOGGER, "连接IO模块 " + logName + " 出错:" + error.ToString()); LogUtil.error(LOGGER, "连接IO模块 " + logName + " 出错:" + 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 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) private void AioBox_DI_Changed_Event(AIOBOX box, Box_Sta[] sta)
{ {
try try
{ {
UpdateAllDI(box.IP, sta); UpdateAllDI(box.IP, sta);
//LogUtil.info("ReadAllDI [" + box.IP + "]:" + string.Join(" ", sta));
} }
catch (Exception ex) catch (Exception ex)
{ {
...@@ -219,7 +159,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -219,7 +159,7 @@ namespace OnlineStore.DeviceLibrary
needUpdate = true; needUpdate = true;
} }
else else
{ {
for (int i = 0; i < newList.Count; i++) for (int i = 0; i < newList.Count; i++)
{ {
if (!(oldList[i].Equals(newList[i]))) if (!(oldList[i].Equals(newList[i])))
...@@ -231,15 +171,13 @@ namespace OnlineStore.DeviceLibrary ...@@ -231,15 +171,13 @@ namespace OnlineStore.DeviceLibrary
} }
if (needUpdate) if (needUpdate)
{ {
// lock (DILock) lock (DILock)
{ {
if (DIValueMap.ContainsKey(ip)) if (DIValueMap.ContainsKey(ip))
{ {
List<Box_Sta> s = new List<Box_Sta>(); DIValueMap.Remove(ip);
DIValueMap.TryRemove(ip,out s);
} }
DIValueMap.TryAdd(ip, newList); DIValueMap.Add(ip, newList);
} }
} }
} }
...@@ -254,7 +192,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -254,7 +192,12 @@ namespace OnlineStore.DeviceLibrary
newList.AddRange(sta); newList.AddRange(sta);
List<Box_Sta> oldList = null; List<Box_Sta> oldList = null;
DOValueMap.TryGetValue(ip, out oldList); 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)) if (oldList == null || oldList.Count.Equals(newList.Count).Equals(false))
{ {
needUpdate = true; needUpdate = true;
...@@ -272,14 +215,13 @@ namespace OnlineStore.DeviceLibrary ...@@ -272,14 +215,13 @@ namespace OnlineStore.DeviceLibrary
} }
if (needUpdate) if (needUpdate)
{ {
// lock (DOLock) lock (DOLock)
{ {
if (DOValueMap.ContainsKey(ip)) if (DOValueMap.ContainsKey(ip))
{ {
List<Box_Sta> list = new List<Box_Sta>(); DOValueMap.Remove(ip);
DOValueMap.TryRemove(ip,out list);
} }
DOValueMap.TryAdd(ip, newList); DOValueMap.Add(ip, newList);
} }
} }
} }
...@@ -290,18 +232,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -290,18 +232,11 @@ namespace OnlineStore.DeviceLibrary
//关闭所有的DO //关闭所有的DO
public override void CloseAllDO() public override void CloseAllDO()
{ {
if (AIOMap == null)
{
return;
}
foreach (AIOBOX aio in AIOMap.Values) foreach (AIOBOX aio in AIOMap.Values)
{ {
ushort length = StoreManager.Config.GetDOLength(aio.IP); ushort length = StoreManager.Config.GetDOLength(aio.IP);
for (ushort i = 0; i < length; i++) 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); aio.WriteDO(i, Box_Sta.Off);
} }
} }
...@@ -309,18 +244,18 @@ namespace OnlineStore.DeviceLibrary ...@@ -309,18 +244,18 @@ namespace OnlineStore.DeviceLibrary
public override void CloseAllConnection() public override void CloseAllConnection()
{ {
try foreach (AIOBOX aio in AIOMap.Values)
{ {
foreach (AIOBOX aio in AIOMap.Values) try
{ {
aio.Close(); aio.Close();
} }
AIOMap.Clear(); catch (Exception ex)
} {
catch (Exception ex) LogUtil.error("aio.Close出错:" + ex.ToString());
{ }
LogUtil.error("CloseAllConnection 出错:" + ex.ToString());
} }
AIOMap.Clear();
} }
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff) public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff)
{ {
...@@ -330,19 +265,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -330,19 +265,10 @@ namespace OnlineStore.DeviceLibrary
AIOBOX aioBox = getAIO(ioIp); AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null) if (aioBox != null)
{ {
// Box_Addr add = GetAddr(StartAddress); bool result = aioBox.WriteDO(StartAddress, GetBox_Sta(onOff));
if (!result)
for (int i = 1; i <= 3; i++)
{ {
bool result = aioBox.WriteDO(StartAddress, GetBox_Sta(onOff)); LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 失败:");
if (!result)
{
LogUtil.error("AIO WriteSingleDO [" + StartAddress + "] 第" + i + "次失败:" + aioBox.ErrInfo);
}
else
{
break;
}
} }
} }
else else
...@@ -352,19 +278,17 @@ namespace OnlineStore.DeviceLibrary ...@@ -352,19 +278,17 @@ namespace OnlineStore.DeviceLibrary
} }
catch (Exception ex) catch (Exception ex)
{ {
LOGGER.Error("出错啦:" + ex.ToString()); LOGGER.Error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错啦:" + ex.ToString());
} }
} }
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds) public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds)
{ {
try try
{ {
AIOBOX aioBox = getAIO(ioIp); AIOBOX aioBox = getAIO(ioIp);
Box_Sta currBox_Sta = GetBox_Sta(onOff);
if (aioBox != null) if (aioBox != null)
{ {
// Box_Addr add = GetAddr(StartAddress); Box_Sta currBox_Sta = GetBox_Sta(onOff);
aioBox.WriteDO(StartAddress, currBox_Sta); aioBox.WriteDO(StartAddress, currBox_Sta);
//写入之后,等待指定间隔后回写 //写入之后,等待指定间隔后回写
...@@ -374,7 +298,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -374,7 +298,7 @@ namespace OnlineStore.DeviceLibrary
try try
{ {
aioBox.WriteDO(StartAddress, aioBox.ReverseStatus(currBox_Sta)); aioBox.WriteDO(StartAddress, aioBox.ReverseStatus(currBox_Sta));
LogUtil.debug(LOGGER, "**********定时回写入 IO【" + ioIp + "," + StartAddress + ",值" + aioBox.ReverseStatus(currBox_Sta) + "】:"); LogUtil.debug(LOGGER, "**********定时回写入 IO [" + ioIp + "] [" + StartAddress + "]值" + aioBox.ReverseStatus(currBox_Sta) + "】:");
} }
catch (Exception ex) catch (Exception ex)
{ {
...@@ -386,12 +310,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -386,12 +310,12 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp); LogUtil.error(LOGGER, "AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错 没有连接IO模块:" + ioIp);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("WriteSingleDO 出错:" + ioIp); LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错:" + ioIp);
} }
} }
public override void ReadAllDI(string ioIp, byte slaveId) public override void ReadAllDI(string ioIp, byte slaveId)
...@@ -407,7 +331,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -407,7 +331,7 @@ namespace OnlineStore.DeviceLibrary
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("ReadAllDI [" + ioIp + "] 出错:" + ex.ToString()); LogUtil.error("ReadAllDI [" + ioIp + "]出错:" + ioIp);
} }
} }
public override void ReadAllDO(string ioIp, byte slaveId) public override void ReadAllDO(string ioIp, byte slaveId)
...@@ -424,37 +348,33 @@ namespace OnlineStore.DeviceLibrary ...@@ -424,37 +348,33 @@ namespace OnlineStore.DeviceLibrary
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("ReadAllDO ["+ioIp+"] 出错:" + ex.ToString()); LogUtil.error("ReadAllDO [" + ioIp + "]出错:" + ioIp);
} }
} }
public override IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress) public override IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress)
{ {
IO_VALUE value = IO_VALUE.LOW; IO_VALUE value = IO_VALUE.LOW;
for (int i = 1; i <= 3; i++) try
{ {
try AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null)
{ {
AIOBOX aioBox = getAIO(ioIP); Box_Sta sta = Box_Sta.Off;
if (aioBox != null) if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress)
{ {
Box_Sta sta = Box_Sta.Off; sta = DOValueMap[ioIP][StartAddress];
if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress) }
{ else
sta = DOValueMap[ioIP][StartAddress]; { sta = aioBox.ReadDO(StartAddress); }
} if (sta.Equals(Box_Sta.On))
else {
{ sta = aioBox.ReadDO(StartAddress); } value = IO_VALUE.HIGH;
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
break;
} }
} }
catch (Exception ex) }
{ catch (Exception ex)
LogUtil.error("GetDOValue [" + ioIP + "] [" + StartAddress + "] [" + i + "] 出错:" + ex.ToString()); {
} LogUtil.error("GetDOValue [" + ioIP + "] [" + StartAddress + "] 出错:" + ex.ToString());
} }
return value; return value;
} }
...@@ -484,12 +404,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -484,12 +404,11 @@ namespace OnlineStore.DeviceLibrary
{ {
value = IO_VALUE.HIGH; value = IO_VALUE.HIGH;
} }
break;
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("GetDIValue [" + ioIP + "] ["+StartAddress+"] [" + i+"] 出错:" + ex.ToString()); LogUtil.error("GetDIValue [" + ioIP + "] [" + StartAddress + "] [" + i + "] 出错:" + ex.ToString());
} }
} }
return value; return value;
...@@ -501,24 +420,20 @@ namespace OnlineStore.DeviceLibrary ...@@ -501,24 +420,20 @@ namespace OnlineStore.DeviceLibrary
{ {
if (configIO.ProType.Equals(ConfigItemType.DI)) if (configIO.ProType.Equals(ConfigItemType.DI))
{ {
return GetDIValue(configIO.DeviceName, configIO.SlaveID, configIO.GetIOAddr()); return GetDIValue(configIO.IO_IP, configIO.SlaveID, configIO.GetIOAddr());
} }
else if (configIO.ProType.Equals(ConfigItemType.DO)) else if (configIO.ProType.Equals(ConfigItemType.DO))
{ {
return GetDOValue(configIO.DeviceName, configIO.SlaveID, configIO.GetIOAddr()); return GetDOValue(configIO.IO_IP, configIO.SlaveID, configIO.GetIOAddr());
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error(LOGGER, " GetIOValue 获取数据出错:" + ex.ToString()); LogUtil.error(LOGGER, " GetIOValue [" + configIO.IO_IP + "] [" + configIO.GetIOAddr() + "] 获取数据出错:" + ex.ToString());
} }
return value; return value;
} }
//private Box_Addr GetAddr(ushort StartAddress)
//{
// return (Box_Addr)(StartAddress);
//}
private Box_Sta GetBox_Sta(IO_VALUE onOff) private Box_Sta GetBox_Sta(IO_VALUE onOff)
{ {
if (onOff.Equals(IO_VALUE.HIGH)) if (onOff.Equals(IO_VALUE.HIGH))
...@@ -539,6 +454,6 @@ namespace OnlineStore.DeviceLibrary ...@@ -539,6 +454,6 @@ namespace OnlineStore.DeviceLibrary
aioBox = AIOMap[ioIp]; aioBox = AIOMap[ioIp];
} }
return aioBox; return aioBox;
} }
} }
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!