using IOB_UT_NEXT; using System; using System.Globalization; using System.IO; namespace IOB_WIN_NEXT.IobModbusTCP { /* -------------------------------------------------------------------------------- * Controlli ModBusTCP FIMAT * - protocollo ModBus TCP * - gestione stato via Modbus * - resto gestioen via file * * G:\Drive condivisi\30_Clienti\Tenditalia\Macchina Fimat * * -------------------------------------------------------------------------------- */ public class ModbusTCPFimat : ModbusTCP { #region Public Constructors /// /// Classe base con i metodi x ModBusTCP /// /// /// public ModbusTCPFimat(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { lgInfo("NEW IOB ModBus TCP FIMAT"); setupSpecialParams(); // provo lettura una prima volta i dati DYN if (currPLC != null && currPLC.Connected) { try { processDynData(); if (EnableTest) { testReadExt(); } } catch (Exception exc) { lgError($"Eccezione in processDynData iniziale x ModBus TCP FIMAT:{Environment.NewLine}{exc}"); } } if (EnableTest) { processDataSync(); } } #endregion Public Constructors #region Protected Fields /// /// Quantità massima PODL prima di fare split ordine (default 999'999) /// protected int maxPodlQty = 999999; #endregion Protected Fields #region Protected Properties /// /// Restituisce controllo IN ALLARME /// protected bool AlarmState { get { return testIntCondition("AlarmIntCond"); } } /// /// Restituisce status di ESTOP triggered (triggered = premuta, altrimenti armed) /// protected bool EStopTriggered { get { return testBitCondition("EStopBitCond"); } } /// /// Restituisce status di Manuale, hard coded /// protected bool ManualState { get { return testBitCondition("ManualBitCond"); } } /// /// Restituisce status di WORK (auto + lavora), hard coded /// protected bool WorkState { get { return testIntCondition("WorkIntCond"); } } #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); } // se ho qualcosa nella holding register... if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0) { // se emergenza NON premuta (triggered) indico OK (armata...) FARE !!! togliere true if (!EStopTriggered) { byteSignals += (1 << 7); } // impiego controlli da setup IntConditions... processo dagli stati + gravi... if (AlarmState || hasAlarms()) { byteSignals += (1 << 3); } else if (ManualState) { byteSignals += (1 << 4); } else if (WorkState) { byteSignals += (1 << 1); } checkTranslateBit(); checkTranslateInt(); } else { lgInfo("HoldingRegisterLUT vuoto!"); } // salvo! B_input = byteSignals; } /// /// Effettua sync dati x PODL attivi /// protected override void processDataSync() { if (hasRecipe) { lgTrace("processDataSync: START"); DateTime adesso = DateTime.Now; Calendar cal = new CultureInfo("it-IT").Calendar; int week = cal.GetWeekOfYear(adesso, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); string tempPath = Path.Combine(pathList["path-locBase"], pathList["path-01-Temp"]); string archPath = Path.Combine(pathList["path-locBase"], pathList["path-02-Sent"], $"{adesso:yyyy}", $"{week:00}"); string remoPath = Path.Combine(pathList["path-locBase"], pathList["path-04-remReq"]); baseUtils.checkDir(tempPath); baseUtils.checkDir(archPath); try { // recupero elenco PODL da processare, check PODL già inviati, save locale bool create = RecipeReqWriteLocal(tempPath, useLocalRecipe); // invio ricette a impianto bool trasmitted = RecipeSend(tempPath, archPath, remoPath); } catch (Exception exc) { lgError($"Eccezione in processDataSync{Environment.NewLine}{exc}"); } lgTrace("processDataSync: Completed"); } else { lgTrace("processDataSync: NO exec, hasRecipe=false"); } } #endregion Protected Methods } }