Commit 692849d3 LN

IO模块更新为最新版本

1 个父辈 18e7406f
...@@ -6,29 +6,10 @@ ...@@ -6,29 +6,10 @@
<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._unrevdRemote"> <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.LISTEN_SLEEP">
<summary>
监听网络接收数据的间隔
必须小于SEND_SLEEP
</summary>
</member>
<member name="T:Asa.IOModule.AIOBOX.DI_Changed">
<summary> <summary>
自动读取DI委托 自动读取DI委托
</summary> </summary>
...@@ -40,55 +21,25 @@ ...@@ -40,55 +21,25 @@
自动读取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"> <member name="M:Asa.IOModule.AIOBOX.#ctor(System.String)">
<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">
<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">
...@@ -96,68 +47,24 @@ ...@@ -96,68 +47,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>
</member>
<member name="P:Asa.IOModule.AIOBOX.InputReadSleep">
<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> </summary>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.CheckIP(System.String)"> <member name="M:Asa.IOModule.AIOBOX.SetType(Asa.IOModule.Box_Type,System.Int32,Asa.IOModule.Box_Type,System.Int32)">
<summary> <summary>
检查IP地址 设置输入输出的类型
</summary> </summary>
<param name="ip"></param> <param name="input"></param>
<returns></returns> <param name="inputCount"></param>
<param name="output"></param>
<param name="outputCount"></param>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.Connect"> <member name="M:Asa.IOModule.AIOBOX.Connect">
<summary> <summary>
...@@ -170,32 +77,18 @@ ...@@ -170,32 +77,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.AutoReadInput(System.Boolean)">
<summary> <summary>
自动读取输入端并触发事件(主动上传数据 = 使能) 相反状态(ON/OFF)
</summary> </summary>
<param name="read">是否自动读取</param> <param name="sta"></param>
<returns></returns>
</member> </member>
<member name="M:Asa.IOModule.AIOBOX.AutoReadOutput(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.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>
...@@ -273,65 +166,66 @@ ...@@ -273,65 +166,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>
......
...@@ -25,19 +25,19 @@ ...@@ -25,19 +25,19 @@
<add key="Store_CID" value="rc1252-auto1" /> <add key="Store_CID" value="rc1252-auto1" />
<!--end one store config--> <!--end one store config-->
<!--摄像机名称列表配置,用#分割--> <!--摄像机名称列表配置,用#分割-->
<add key="CameraName" value="" /> <add key="CameraName" value="GigE:acA3800-10gc (23124327)#GigE:acA3800-10gc (23172285)" />
<!--二维码类型列表配置,用#分割--> <!--二维码类型列表配置,用#分割-->
<add key="CodeType" value="QR Code" /> <add key="CodeType" value="QR Code" />
<!--<add key="CodeType" value="Data Matrix ECC 200#QR Code"/>--> <add key="CodeType" value="Data Matrix ECC 200#QR Code" />
<!--二维码参数文件所在路径,文件名与二维码类型名一样--> <!--二维码参数文件所在路径,文件名与二维码类型名一样-->
<add key="CodeParamPath" value="\CodeParam\" /> <add key="CodeParamPath" value="\CodeParam\" />
<add key="InOutDefaultPosition" value="5000" /> <add key="InOutDefaultPosition" value="50000000" />
<add key="Config_Pwd" value="123456" /> <add key="Config_Pwd" value="123456" />
<!--5000脉冲对应1mm--> <!--5000脉冲对应1mm-->
<add key="AxisChangeValue" value="5000" /> <add key="AxisChangeValue" value="4020" />
<!--压紧轴计量检测信号亮1次的脉冲值--> <!--压紧轴计量检测信号亮1次的脉冲值-->
<add key="ComAxisChangeValue" value="150000" /> <add key="ComAxisChangeValue" value="150000" />
<add key="DebugPosId" value="1#AC2_1_1_6" /> <add key="DebugPosId" value="1#AC1_11_3_20" />
<!--是否有门禁屏蔽功能,=1表示有此功能--> <!--是否有门禁屏蔽功能,=1表示有此功能-->
<add key="HasDisableDoorControl" value="1" /> <add key="HasDisableDoorControl" value="1" />
<add key="ACBaudRate" value="115200" /> <add key="ACBaudRate" value="115200" />
...@@ -47,18 +47,21 @@ ...@@ -47,18 +47,21 @@
<add key="DOMS" value="200" /> <add key="DOMS" value="200" />
<add key="SinglePosId" value="1#AC2_1_1_6" /> <add key="SinglePosId" value="1#AC2_1_1_6" />
<!--配置文件的表头格式,0=中文,1=英文--> <!--配置文件的表头格式,0=中文,1=英文-->
<add key ="LibNameType" value ="0"/> <add key="LibNameType" value="0" />
<add key="DefaultPWD" value ="123456"/> <add key="DefaultPWD" value="123456" />
<!--自动出入库时使用--> <!--自动出入库时使用-->
<add key ="LOC" value ="1"/> <add key="LOC" value="1" />
<!--最多识别多少个二维码--> <!--最多识别多少个二维码-->
<add key ="QRCodeCount" value ="1"/> <add key="QRCodeCount" value="1" />
<add key ="OpenCycleOut" value ="0"/> <add key="OpenCycleOut" value="0" />
<!--IO模块是否主动上传--> <add key="Tool_P3_Offset" value="6000" />
<add key ="AIOAutoUpload" value ="0"/> <add key="Tool_P4_Offset" value="-6000" />
<add key ="CodeRun" value ="0"/> <add key="Tool_P5_Offset" value="-6000" />
<add key="Tool_P6_Offset" value="6000" />
<add key="Tool_TargetSpeed" value="20" />
<add key="Tool_TargetPosition" value="6000" />
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs/AutoStore1.log" /> <file value="logs/AutoStore1.log" />
<param name="Encoding" value="UTF-8" /> <param name="Encoding" value="UTF-8" />
...@@ -73,8 +76,8 @@ ...@@ -73,8 +76,8 @@
<levelMax value="ERROR" /> <levelMax value="ERROR" />
</filter> </filter>
</appender> </appender>
<appender name="AIOBOXLog" type="log4net.Appender.RollingFileAppender"> <appender name="AIOBOX" type="log4net.Appender.RollingFileAppender">
<file value="logs/aio/AIOBOX1.log" /> <file value="logs/aio/AIOBOX.log" />
<param name="Encoding" value="UTF-8" /> <param name="Encoding" value="UTF-8" />
<appendToFile value="true" /> <appendToFile value="true" />
<rollingStyle value="Date" /> <rollingStyle value="Date" />
...@@ -87,10 +90,10 @@ ...@@ -87,10 +90,10 @@
<level value="Info" /> <level value="Info" />
<appender-ref ref="RollingLogFileAppender" /> <appender-ref ref="RollingLogFileAppender" />
</logger> </logger>
<logger name="AIOBOXLog"> <logger name="AIOBOX">
<level value="Info" /> <level value="Info" />
<appender-ref ref="AIOBOXLog" /> <appender-ref ref="AIOBOX" />
</logger> </logger>
<root> <root>
<level value="INFO" /> <level value="INFO" />
<appender-ref ref="RollingLogFileAppender" /> <appender-ref ref="RollingLogFileAppender" />
......
...@@ -9,15 +9,12 @@ using OnlineStore.Common; ...@@ -9,15 +9,12 @@ 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.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 Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>(); 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>> DIValueMap = new Dictionary<string, List<Box_Sta>>();
...@@ -28,63 +25,35 @@ namespace OnlineStore.DeviceLibrary ...@@ -28,63 +25,35 @@ namespace OnlineStore.DeviceLibrary
private object DILock = ""; private object DILock = "";
private object DOLock = ""; private object DOLock = "";
private List<string> IoIPLIst = new List<string>();
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)
{ {
bool autoUpload = ConfigAppSettings.GetIntValue(Setting_Init.AIOAutoUpload).Equals(1);
AIOBOX aioBox = null; AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp)) if (AIOMap.ContainsKey(ioIp))
{ {
aioBox = AIOMap[ioIp]; aioBox = AIOMap[ioIp];
try
if (null != aioBox) {
if (null != aioBox)
{
aioBox.Close();
aioBox = null;
}
}
catch (Exception ex)
{ {
aioBox.Close(); LogUtil.error("关闭Io模块【" + ioIp + "】出错:" + ex.ToString());
aioBox = null;
} }
AIOMap.Remove(ioIp); AIOMap.Remove(ioIp);
} }
...@@ -96,99 +65,40 @@ namespace OnlineStore.DeviceLibrary ...@@ -96,99 +65,40 @@ namespace OnlineStore.DeviceLibrary
{ {
DOValueMap.Remove(ioIp); DOValueMap.Remove(ioIp);
} }
int DIMS = ConfigAppSettings.GetIntValue("DIMS");
if (DIMS < 20) int DILength = StoreManager.Config.GetDILength(ioIp);
{ int DOLength = StoreManager.Config.GetDOLength(ioIp);
DIMS = 20; string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "] ";
}
int DOMS = ConfigAppSettings.GetIntValue("DOMS");
if (DOMS < 200)
{
DOMS = 200;
}
int DILength = GetDILength(ioIp);
int DOLength = GetDOLength(ioIp);
string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "],[" + DIMS + "] [" + DOMS + "]";
try try
{ {
// Create new modbus master and add event functions aioBox = new AIOBOX("AIOBOX");
aioBox = new AIOBOX(); aioBox.SetType(Asa.IOModule.Box_Type.DI, DILength, Asa.IOModule.Box_Type.DO, DOLength);
aioBox.IP = ioIp; aioBox.IP = ioIp;
aioBox.Upload = false;
// bool rtn = aioBox.AutoIP(ioIp);
aioBox.SetInput(Asa.IOModule.Box_Type.DI, DILength);
aioBox.SetOutput(Asa.IOModule.Box_Type.DO, DOLength);
if (autoUpload)
{
aioBox.AutoReadInput(true);
}
else
{
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 + ",尝试重连3次"); LogUtil.info("开始连接:" + logName + ":");
for (int i = 1; i <= 3; i++) aioBox.Connect();
{
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);
}
AIOMap.Add(ioIp, aioBox);
Thread.Sleep(5);
//读取所有的DO
ReadAllDI(ioIp, 0);
Thread.Sleep(5);
GC.Collect();
} }
catch (Exception error) catch (Exception error)
{ {
LogUtil.error(LOGGER, "连接IO模块 " + logName + " 出错:" + error.ToString()); LogUtil.error("连接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)
{ {
...@@ -213,10 +123,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -213,10 +123,9 @@ namespace OnlineStore.DeviceLibrary
LogUtil.error("AioBox_DO_Changed_Event出错:" + ex.ToString()); LogUtil.error("AioBox_DO_Changed_Event出错:" + ex.ToString());
} }
} }
private void UpdateAllDI(string ip, Box_Sta[] sta) private void UpdateAllDI(string ip, Box_Sta[] sta)
{ {
if (sta != null && sta.Length >= GetDILength(ip)) if (sta != null && sta.Length >= StoreManager.Config.GetDILength(ip))
{ {
string updateDi = "[" + ip + "]:"; string updateDi = "[" + ip + "]:";
bool needUpdate = false; bool needUpdate = false;
...@@ -230,14 +139,6 @@ namespace OnlineStore.DeviceLibrary ...@@ -230,14 +139,6 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
//foreach(Box_Sta s in sta)
//{
// updateDi += s.ToString() + ",";
//}
//if (ip.Equals("192.168.201.61"))
//{
// LogUtil.info(updateDi);
//}
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])))
...@@ -262,7 +163,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -262,7 +163,7 @@ namespace OnlineStore.DeviceLibrary
} }
private void UpdateAllDO(string ip, Box_Sta[] sta) private void UpdateAllDO(string ip, Box_Sta[] sta)
{ {
if (sta != null && sta.Length >= GetDOLength(ip)) if (sta != null && sta.Length >= StoreManager.Config.GetDOLength(ip))
{ {
bool needUpdate = false; bool needUpdate = false;
...@@ -270,12 +171,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -270,12 +171,7 @@ 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;
...@@ -303,17 +199,6 @@ namespace OnlineStore.DeviceLibrary ...@@ -303,17 +199,6 @@ namespace OnlineStore.DeviceLibrary
} }
} }
} }
//else
//{
// if (sta == null)
// {
// LogUtil.error("UpdateAllDO ip[" + ip + "], sta=null");
// }
// else
// {
// LogUtil.error(" UpdateAllDO ip[" + ip + "], sta.Length=" + sta.Length);
// }
//}
} }
...@@ -323,12 +208,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -323,12 +208,9 @@ namespace OnlineStore.DeviceLibrary
{ {
foreach (AIOBOX aio in AIOMap.Values) foreach (AIOBOX aio in AIOMap.Values)
{ {
ushort length = 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);
} }
} }
...@@ -336,27 +218,18 @@ namespace OnlineStore.DeviceLibrary ...@@ -336,27 +218,18 @@ namespace OnlineStore.DeviceLibrary
public override void CloseAllConnection() public override void CloseAllConnection()
{ {
try foreach (AIOBOX aio in AIOMap.Values)
{ {
if (conTimer != null) try
{
conTimer.Stop();
}
if (AIOMap == null)
{ {
return; aio.Close();
} }
foreach (AIOBOX aio in AIOMap.Values) catch (Exception ex)
{ {
aio.Close(); LogUtil.error("aio.Close出错:" + ex.ToString());
} }
} }
catch (Exception ex)
{
LogUtil.error("AIO CloseAllConnection Error:" + ex.ToString());
}
AIOMap.Clear(); 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)
{ {
...@@ -366,41 +239,30 @@ namespace OnlineStore.DeviceLibrary ...@@ -366,41 +239,30 @@ 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
{ {
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp); LogUtil.error("WriteSingleDO出错 没有连接IO模块:" + ioIp);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LOGGER.Error("出错啦:" + ex.ToString()); LogUtil.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);
//写入之后,等待指定间隔后回写 //写入之后,等待指定间隔后回写
...@@ -410,24 +272,25 @@ namespace OnlineStore.DeviceLibrary ...@@ -410,24 +272,25 @@ 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("**********定时回写入 IO [" + ioIp + "] [" + StartAddress + "]值" + aioBox.ReverseStatus(currBox_Sta) + "】:");
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error(LOGGER, "**********定时回写入 出错:" + ex.StackTrace); LogUtil.error("**********定时回写入 出错:" + ex.ToString());
} }
}; };
mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次; mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次;
mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask; mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask;
} }
else else
{ {
LogUtil.error(LOGGER, "WriteSingleDO出错 没有连接IO模块:" + ioIp); LogUtil.error("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)
...@@ -437,13 +300,13 @@ namespace OnlineStore.DeviceLibrary ...@@ -437,13 +300,13 @@ namespace OnlineStore.DeviceLibrary
AIOBOX aioBox = getAIO(ioIp); AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null) if (aioBox != null)
{ {
Box_Sta[] allDi = aioBox.ReadDI(0, GetDILength(ioIp)); Box_Sta[] allDi = aioBox.ReadDI(0, StoreManager.Config.GetDILength(ioIp));
UpdateAllDI(ioIp, allDi); UpdateAllDI(ioIp, allDi);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("ReadAllDI出错:" + ioIp); LogUtil.error("ReadAllDI [" + ioIp + "]出错:" + ioIp);
} }
} }
public override void ReadAllDO(string ioIp, byte slaveId) public override void ReadAllDO(string ioIp, byte slaveId)
...@@ -454,27 +317,24 @@ namespace OnlineStore.DeviceLibrary ...@@ -454,27 +317,24 @@ namespace OnlineStore.DeviceLibrary
if (aioBox != null) if (aioBox != null)
{ {
// int startIndex = StoreManager.Config.GetDILength(ioIp); // int startIndex = StoreManager.Config.GetDILength(ioIp);
Box_Sta[] allDO = aioBox.ReadDO(0, GetDOLength(ioIp)); Box_Sta[] allDO = aioBox.ReadDO(0, StoreManager.Config.GetDOLength(ioIp));
UpdateAllDO(ioIp, allDO); UpdateAllDO(ioIp, allDO);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("ReadAllDO出错:" + ioIp); 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.None;
try try
{ {
AIOBOX aioBox = getAIO(ioIP); AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null) if (aioBox != null)
{ {
Box_Sta sta = Box_Sta.Off; 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) if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress)
{ {
sta = DOValueMap[ioIP][StartAddress]; sta = DOValueMap[ioIP][StartAddress];
...@@ -485,49 +345,61 @@ namespace OnlineStore.DeviceLibrary ...@@ -485,49 +345,61 @@ namespace OnlineStore.DeviceLibrary
{ {
value = IO_VALUE.HIGH; value = IO_VALUE.HIGH;
} }
else
{
value = IO_VALUE.LOW;
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("GetDOValue 出错:" + ex.ToString()); LogUtil.error("GetDOValue [" + ioIP + "] [" + StartAddress + "] 出错:" + ex.ToString());
} }
return value; return value;
} }
public override IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress) public override IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress)
{ {
IO_VALUE value = IO_VALUE.LOW; IO_VALUE value = IO_VALUE.None;
try for (int i = 1; i <= 3; i++)
{ {
AIOBOX aioBox = getAIO(ioIP); try
if (aioBox != null)
{ {
Box_Sta sta = Box_Sta.Off; AIOBOX aioBox = getAIO(ioIP);
// Box_Addr addr = GetAddr(StartAddress); if (aioBox != null)
int index = StartAddress;
if (DIValueMap.ContainsKey(ioIP) && DIValueMap[ioIP].Count > index)
{
sta = DIValueMap[ioIP][index];
}
else
{ {
sta = aioBox.ReadDI(StartAddress); Box_Sta sta = Box_Sta.Off;
} // Box_Addr addr = GetAddr(StartAddress);
if (sta.Equals(Box_Sta.On)) int index = StartAddress;
{ if (DIValueMap.ContainsKey(ioIP) && DIValueMap[ioIP].Count > index)
value = IO_VALUE.HIGH; {
sta = DIValueMap[ioIP][index];
}
else
{
sta = aioBox.ReadDI(StartAddress);
}
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
else
{
value = IO_VALUE.LOW;
}
} }
break;
}
catch (Exception ex)
{
LogUtil.error(" 第【" + i + "】次 GetDIValue [" + ioIP + "] [" + StartAddress + "] 出错:" + ex.ToString());
} }
}
catch (Exception ex)
{
LogUtil.error("GetDIValue 出错:" + ex.ToString());
} }
return value; return value;
} }
public override IO_VALUE GetIOValue(ConfigIO configIO) public override IO_VALUE GetIOValue(ConfigIO configIO)
{ {
IO_VALUE value = IO_VALUE.LOW; IO_VALUE value = IO_VALUE.None;
try try
{ {
if (configIO.ProType.Equals(ConfigItemType.DI)) if (configIO.ProType.Equals(ConfigItemType.DI))
...@@ -541,15 +413,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -541,15 +413,11 @@ namespace OnlineStore.DeviceLibrary
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error(LOGGER, " GetIOValue 获取数据出错:" + ex.ToString()); LogUtil.error(" GetIOValue [" + configIO.DeviceName + "] [" + 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))
...@@ -571,5 +439,6 @@ namespace OnlineStore.DeviceLibrary ...@@ -571,5 +439,6 @@ namespace OnlineStore.DeviceLibrary
} }
return aioBox; return aioBox;
} }
} }
} }
...@@ -9,6 +9,7 @@ namespace OnlineStore.LoadCSVLibrary ...@@ -9,6 +9,7 @@ namespace OnlineStore.LoadCSVLibrary
{ {
public enum IO_VALUE public enum IO_VALUE
{ {
None=-1,
/// <summary> /// <summary>
/// 低位 /// 低位
/// </summary> /// </summary>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!