using EasyModbus; using System; namespace IOB_WIN_NEXT.IobModbusTCP { /* -------------------------------------------------------------------------------- * Controlli ModBusTCP IMAS Aeromeccanica * - protocollo ModBus TCP * - specifico comportamento impianti filtrazione IMAS Aeromeccanica * - gestione allarmi * * STRUTTURA MEMORIA a banchi di UInt16, convertiti successivamente in int EVENTUALMENTE divisi per 10/100/1000 * G:\Drive condivisi\30_Clienti\Jetco\Manuali CNC-PLC\Aspiratori * * -------------------------------------------------------------------------------- */ public class ModbusTCPImaxAeromec : ModbusTCP { #region Public Constructors /// /// Classe base con i metodi x ModBusTCP /// /// /// public ModbusTCPImaxAeromec(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { lgInfo("NEW IOB ModBus TCP IMAS Aeromec"); // provo lettura una prima volta i dati DYN if (currPLC != null && currPLC.Connected) { try { processDynData(); } catch (Exception exc) { lgError($"Eccezione in processDynData iniziale x ModBus TCP IMAS Aeromec:{Environment.NewLine}{exc}"); } } } #endregion Public Constructors #region Protected Properties /// /// Restituisce status di AUTOmatico, hard coded /// protected bool Auto { get { return testCondition("WorkBitCond"); #if false bool answ = false; int currStatus = 0; // hard coded int statusReg = 40002; int[] listInt = new int[2]; listInt = HoldingRegisterLUT[statusReg]; currStatus = ModbusClient.ConvertRegistersToInt(listInt); // hard coded il 5° bit answ = ((currStatus & (1 << 14)) > 0); return answ; #endif } } /// /// Restituisce status di ESTOP triggered (triggered = premuta, altrimenti armed) /// protected bool EStopTriggered { get { return testCondition("EStopBitCond"); } } /// /// Restituisce status di LAVORA, hard coded /// protected bool Work { get { return testCondition("WorkBitCond"); #if false bool answ = false; int currStatus = 0; // hard coded int statusReg = 40002; int[] listInt = new int[2]; listInt = HoldingRegisterLUT[statusReg]; currStatus = ModbusClient.ConvertRegistersToInt(listInt); // hard coded il 5° bit answ = ((currStatus & (1 << 0)) > 0); return answ; #endif } } #endregion Protected Properties #region Protected Methods /// /// Effettua decodifica aree memoria alla bitmap usata x MAPO /// protected override void decodeToBaseBitmap() { // init a zero... B_input = 0; /* ----------------------------------------------------- * bitmap MAPO STANDARD 60 * B0: POWER_ON * B1: RUN * B2: pzCount * B3: allarme * B4: manuale * B5: slowTC * B6: WarmUpCoolDown * B7: EmergArmata * ----------------------------------------------------- */ var MemInt = new byte[2]; int byteSignals = 0; // bit 0 (poweron) imposto a 1 SE connected... if (currPLC.Connected) { byteSignals += (1 << 0); } if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0) { // se emergenza NON premuta (triggered) indico OK (armata...) if (!EStopTriggered) { byteSignals += (1 << 7); } // processo dagli stati + gravi... if (hasAlarms()) { byteSignals += (1 << 3); } if (Work) { byteSignals += (1 << 1); } if (!Auto) { byteSignals += (1 << 4); } } else { lgInfo("HoldingRegisterLUT vuoto!"); } // salvo! B_input = byteSignals; } #endregion Protected Methods #region Private Methods /// /// Testa la condition modbus da LUT + configurazione /// /// /// private bool testCondition(string cKey) { bool answ = false; if (OptCheckCondBit.ContainsKey(cKey)) { int currStatus = 0; int[] listInt = new int[2]; listInt = HoldingRegisterLUT[OptCheckCondBit[cKey].BaseAddr]; currStatus = ModbusClient.ConvertRegistersToInt(listInt); // hard coded il 9° bit a zero answ = ((currStatus & (1 << OptCheckCondBit[cKey].BitNum)) == OptCheckCondBit[cKey].ValOk); lgTrace($"testCondition for {cKey} | BaseAddr: {OptCheckCondBit[cKey].BaseAddr} | BitNum: {OptCheckCondBit[cKey].BitNum} | ValOk: {OptCheckCondBit[cKey].ValOk}"); } else { lgTrace($"testCondition error: {cKey} not found"); } return answ; } #endregion Private Methods } }