Commit e8bad718 LN

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

1 个父辈 ba23a99d
......@@ -6,94 +6,52 @@
<members>
<member name="T:Asa.IOModule.AIOBOX">
<summary>
AIOBOX操作类
零点IO模块操作类
</summary>
</member>
<member name="F:Asa.IOModule.AIOBOX.suspend">
<member name="T:Asa.IOModule.AIOBOX.DIO_Changed">
<summary>
暂停次数
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状态事件的间隔
自动读取DIO委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta"></param>
</member>
<member name="T:Asa.IOModule.AIOBOX.DI_Changed">
<member name="T:Asa.IOModule.AIOBOX.AIO_Changed">
<summary>
自动读取DI委托
自动读取AIO委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DI状态</param>
<param name="val"></param>
</member>
<member name="E:Asa.IOModule.AIOBOX.DI_Changed_Event">
<summary>
自动读取DI事件触发
</summary>
</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">
<summary>
自动读取DO事件触发
</summary>
</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">
<summary>
自动读取AI事件触发
</summary>
</member>
<member name="T:Asa.IOModule.AIOBOX.AO_Changed">
<summary>
自动读取AO委托
</summary>
<param name="box">AIOBOX</param>
<param name="val">所有AO的值</param>
</member>
<member name="E:Asa.IOModule.AIOBOX.AO_Changed_Event">
<member name="M:Asa.IOModule.AIOBOX.#ctor(System.String)">
<summary>
自动读取AO事件触发
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.#ctor">
<summary>
AIOBOX
零点IO模块操作类
</summary>
<param name="logName"></param>
</member>
<member name="P:Asa.IOModule.AIOBOX.IP">
<summary>
IP地址
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.Port">
<member name="P:Asa.IOModule.AIOBOX.Upload">
<summary>
ModBus端口
输入主动上传
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.IsConn">
......@@ -101,61 +59,24 @@
是否连接
</summary>
</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">
<summary>
输入总数
DI总数
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.OutputCount">
<summary>
输出总数
DO总数
</summary>
</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>
自动读取DI间隔
设置输入输出的类型
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.OutputReadSleep">
<summary>
自动读取DO间隔
</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>
<param name="input"></param>
<param name="inputCount"></param>
<param name="output"></param>
<param name="outputCount"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.Connect">
<summary>
......@@ -168,26 +89,18 @@
关闭连接
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput(System.Boolean,System.Int32)">
<summary>
自动读取输入端,触发事件
</summary>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于15ms</param>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput(System.Boolean,System.Int32)">
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<summary>
自动读取输出端,触发事件
相反状态(ON/OFF)
</summary>
<param name="read">是否自动读取</param>
<param name="sleep">间隔,必须大于10ms</param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta@)">
<summary>
相反状态(ON/OFF)
</summary>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32)">
<summary>
......@@ -265,65 +178,66 @@
</member>
<member name="M:Asa.IOModule.AIOBOX.Send">
<summary>
发送命令
发送命令线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Receive">
<member name="M:Asa.IOModule.AIOBOX.GetReadDI_Command">
<summary>
接收命令
获取ReadDI的命令
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadSingle(System.Byte[])">
<member name="M:Asa.IOModule.AIOBOX.GetReadDO_Command">
<summary>
读取写入单个DO,功能码5
获取ReadDO的命令
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Byte[])">
<member name="M:Asa.IOModule.AIOBOX.Listen">
<summary>
读取所有DO状态,功能码1
监听网络线程
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Byte[])">
<member name="M:Asa.IOModule.AIOBOX.CommandProcess(System.Byte[])">
<summary>
读取所有DI状态,功能码2
接收到的命令处理方法,(task多线程)
</summary>
<returns></returns>
<param name="cmd"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Byte[])">
<member name="M:Asa.IOModule.AIOBOX.Reconn">
<summary>
读取所有AI的值,功能码4
重连线程
</summary>
<param name="buff"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Command">
<member name="M:Asa.IOModule.AIOBOX.Open">
<summary>
命令,前7个字节
打开socket建立连接
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.TriggerDIO">
<member name="M:Asa.IOModule.AIOBOX.CheckIP(System.String)">
<summary>
触发DIO改变事件
检查IP地址
</summary>
<param name="ip"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadInput">
<member name="M:Asa.IOModule.AIOBOX.AutoIP(System.String)">
<summary>
自动读取输入端线程
自动获取IP地址,未连接前使用,必须在同一网段
</summary>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput">
<member name="M:Asa.IOModule.AIOBOX.GetIP">
<summary>
自动读取输出端线程
获取IO模块IP地址
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Listen">
<member name="M:Asa.IOModule.AIOBOX.Command">
<summary>
监听结果线程
命令,前7个字节
</summary>
<returns></returns>
</member>
<member name="T:Asa.IOModule.Box_Type">
<summary>
......@@ -365,248 +279,5 @@
闭合,打开,高电平
</summary>
</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>
</doc>
......@@ -11,99 +11,40 @@ namespace OnlineStore.DeviceLibrary
{
public class AIOAIManager:AIManager
{
private object AILock = "";
private List<int> AIValList = null;
private object AILock = "";
private int AILength = 4;
private Asa.IOModule.AIOBOX AIBox = null;
private System.Timers.Timer conTimer = null;
private List<string> needConIp = new List<string>();
private Asa.IOModule.AIOBOX AiBox = null;
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)
{
bool result = ConnectionIP(ip);
}
if (needConIp.Count > 0)
{
//启动定时器,1一分钟重连一次
conTimer.Start();
}
}
}
private bool ConnectionIP(string ioIp)
private bool 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;
AiBox = new Asa.IOModule.AIOBOX();
AiBox.IP = ioIp;
AiBox.SetType(Asa.IOModule.Box_Type.AI, AILength, Box_Type.AO, 0);
LogUtil.debug("开始连接AI模块[" + ioIp + "][" + autoMS + "],尝试重连三次");
for (int i = 1; i <= 3; i++)
{
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);
}
bool result = AiBox.Connect();
}
catch (Exception error)
{
LogUtil.error("连接IO模块[" + ioIp + "][" + autoMS + "]出错:" + error.ToString());
}
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()
{
try
{
if (AIBox != null)
if (AiBox != null)
{
AIBox.Close();
AiBox.Close();
}
}
catch (Exception ex)
......@@ -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)
{
for (int i = 1; i <= 3; i++)
if (AiBox != null)
{
try
{
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 AiBox.ReadAI(index);
}
return 0;
return -1;
}
}
}
}
......@@ -9,182 +9,122 @@ using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System.Threading.Tasks;
using Asa.IOModule;
using System.Collections.Concurrent;
using System.Windows.Forms;
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 ConcurrentDictionary<string, List<Box_Sta>> DIValueMap = new ConcurrentDictionary<string, List<Box_Sta>>();
public ConcurrentDictionary<string, List<Box_Sta>> DOValueMap = new ConcurrentDictionary<string, List<Box_Sta>>();
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 = "";
private List<string> IoIPLIst = new List<string>();
private System.Timers.Timer conTimer = null;
//private List<string> IoIPLIst = new List<string>();
//private System.Timers.Timer conTimer = null;
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)
{
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)
{
AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp))
{
aioBox = AIOMap[ioIp];
if (null != aioBox)
try
{
aioBox.Close();
aioBox = null;
if (null != aioBox)
{
aioBox.Close();
aioBox = null;
}
}
catch (Exception ex)
{
LogUtil.error("关闭Io模块【" + ioIp + "】出错:" + ex.ToString());
}
AIOMap.Remove(ioIp);
}
List<Box_Sta> list = new List<Box_Sta>();
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.TryRemove(ioIp,out list);
DIValueMap.Remove(ioIp);
}
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.TryRemove(ioIp, out list);
DOValueMap.Remove(ioIp);
}
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");
if (DOMS < 200)
if (DOMS <= 0)
{
DOMS = 300;
}
else if (DOMS < 100)
{
DOMS = 200;
DOMS = 300;
}
int DILength = StoreManager.Config.GetDILength(ioIp);
int DOLength = StoreManager.Config.GetDOLength(ioIp);
string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "],[" + DIMS + "] [" + DOMS + "]";
try
{
// Create new modbus master and add event functions
{
aioBox = new AIOBOX();
aioBox.SetType(Box_Type.DI, DILength, Box_Type.DO, DOLength);
aioBox.IP = ioIp;
// bool rtn = aioBox.AutoIP(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.Upload = false;
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);
aioBox.DO_Changed_Event += AioBox_DO_Changed_Event;
LogUtil.debug("开始连接" + logName + ",尝试重连5次");
for (int i = 1; i <= 3; i++)
{
bool result = aioBox.Connect();
if (result)
{
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);
}
bool conRes = aioBox.Connect();
LogUtil.info("开始连接:" + logName + ":" + conRes.ToString());
AIOMap.Add(ioIp, aioBox);
Thread.Sleep(5);
//读取所有的DO
ReadAllDI(ioIp, 0);
Thread.Sleep(5);
GC.Collect();
}
catch (Exception error)
{
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 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);
//LogUtil.info("ReadAllDI [" + box.IP + "]:" + string.Join(" ", sta));
}
catch (Exception ex)
{
......@@ -219,7 +159,7 @@ namespace OnlineStore.DeviceLibrary
needUpdate = true;
}
else
{
{
for (int i = 0; i < newList.Count; i++)
{
if (!(oldList[i].Equals(newList[i])))
......@@ -231,15 +171,13 @@ namespace OnlineStore.DeviceLibrary
}
if (needUpdate)
{
// lock (DILock)
lock (DILock)
{
if (DIValueMap.ContainsKey(ip))
{
List<Box_Sta> s = new List<Box_Sta>();
DIValueMap.TryRemove(ip,out s);
DIValueMap.Remove(ip);
}
DIValueMap.TryAdd(ip, newList);
DIValueMap.Add(ip, newList);
}
}
}
......@@ -254,7 +192,12 @@ namespace OnlineStore.DeviceLibrary
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;
......@@ -272,14 +215,13 @@ namespace OnlineStore.DeviceLibrary
}
if (needUpdate)
{
// lock (DOLock)
lock (DOLock)
{
if (DOValueMap.ContainsKey(ip))
{
List<Box_Sta> list = new List<Box_Sta>();
DOValueMap.TryRemove(ip,out list);
DOValueMap.Remove(ip);
}
DOValueMap.TryAdd(ip, newList);
DOValueMap.Add(ip, newList);
}
}
}
......@@ -290,18 +232,11 @@ namespace OnlineStore.DeviceLibrary
//关闭所有的DO
public override void CloseAllDO()
{
if (AIOMap == null)
{
return;
}
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);
}
}
......@@ -309,18 +244,18 @@ namespace OnlineStore.DeviceLibrary
public override void CloseAllConnection()
{
try
foreach (AIOBOX aio in AIOMap.Values)
{
foreach (AIOBOX aio in AIOMap.Values)
try
{
aio.Close();
}
AIOMap.Clear();
}
catch (Exception ex)
{
LogUtil.error("CloseAllConnection 出错:" + ex.ToString());
catch (Exception ex)
{
LogUtil.error("aio.Close出错:" + ex.ToString());
}
}
AIOMap.Clear();
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff)
{
......@@ -330,19 +265,10 @@ namespace OnlineStore.DeviceLibrary
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)
{
bool result = aioBox.WriteDO(StartAddress, GetBox_Sta(onOff));
if (!result)
{
LogUtil.error("AIO WriteSingleDO [" + StartAddress + "] 第" + i + "次失败:" + aioBox.ErrInfo);
}
else
{
break;
}
LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 失败:");
}
}
else
......@@ -352,19 +278,17 @@ namespace OnlineStore.DeviceLibrary
}
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)
{
try
{
AIOBOX aioBox = getAIO(ioIp);
Box_Sta currBox_Sta = GetBox_Sta(onOff);
if (aioBox != null)
{
// Box_Addr add = GetAddr(StartAddress);
Box_Sta currBox_Sta = GetBox_Sta(onOff);
aioBox.WriteDO(StartAddress, currBox_Sta);
//写入之后,等待指定间隔后回写
......@@ -374,7 +298,7 @@ namespace OnlineStore.DeviceLibrary
try
{
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)
{
......@@ -386,12 +310,12 @@ namespace OnlineStore.DeviceLibrary
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp);
LogUtil.error(LOGGER, "AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错 没有连接IO模块:" + ioIp);
}
}
catch (Exception ex)
{
LogUtil.error("WriteSingleDO 出错:" + ioIp);
LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错:" + ioIp);
}
}
public override void ReadAllDI(string ioIp, byte slaveId)
......@@ -407,7 +331,7 @@ namespace OnlineStore.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error("ReadAllDI [" + ioIp + "] 出错:" + ex.ToString());
LogUtil.error("ReadAllDI [" + ioIp + "]出错:" + ioIp);
}
}
public override void ReadAllDO(string ioIp, byte slaveId)
......@@ -424,37 +348,33 @@ namespace OnlineStore.DeviceLibrary
}
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)
{
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);
if (aioBox != null)
Box_Sta sta = Box_Sta.Off;
if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress)
{
Box_Sta sta = Box_Sta.Off;
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;
}
break;
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 [" + ioIP + "] [" + StartAddress + "] [" + i + "] 出错:" + ex.ToString());
}
}
catch (Exception ex)
{
LogUtil.error("GetDOValue [" + ioIP + "] [" + StartAddress + "] 出错:" + ex.ToString());
}
return value;
}
......@@ -484,12 +404,11 @@ namespace OnlineStore.DeviceLibrary
{
value = IO_VALUE.HIGH;
}
break;
}
}
catch (Exception ex)
{
LogUtil.error("GetDIValue [" + ioIP + "] ["+StartAddress+"] [" + i+"] 出错:" + ex.ToString());
LogUtil.error("GetDIValue [" + ioIP + "] [" + StartAddress + "] [" + i + "] 出错:" + ex.ToString());
}
}
return value;
......@@ -501,24 +420,20 @@ namespace OnlineStore.DeviceLibrary
{
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))
{
return GetDOValue(configIO.DeviceName, configIO.SlaveID, configIO.GetIOAddr());
return GetDOValue(configIO.IO_IP, configIO.SlaveID, configIO.GetIOAddr());
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, " GetIOValue 获取数据出错:" + ex.ToString());
LogUtil.error(LOGGER, " GetIOValue [" + configIO.IO_IP + "] [" + configIO.GetIOAddr() + "] 获取数据出错:" + 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))
......@@ -539,6 +454,6 @@ namespace OnlineStore.DeviceLibrary
aioBox = AIOMap[ioIp];
}
return aioBox;
}
}
}
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!