2026-06-05 13:44:39 +09:00

437 lines
13 KiB
C#

using Aurora.Api;
using AuroraDeviceCommon;
using Hermes;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AuroraLaser.Amplitude
{
public enum eLaserTrigger : int
{
INTERNAL,
EXTERNAL,
}
public enum eLaserGate : int
{
INTERNAL,
EXTERNAL,
}
public enum eLaserAlignment : int
{
NO,
YES,
}
public enum eLaserTransmission : int
{
Software,
AnalogInput,
}
public enum eLaserPowerTransmission : int
{
RF_POWER,
LASER_POWER_TRANS,
LASER_POWER,
}
public class LaserSatsumaDisplay : ModbusDevice
{
Logger Log = new Logger("SatsumaDisplay");
public enum e_COIL_INPUT
{
e_SYSTEM_STOP,
e_LASER_ON_STANDBY,
e_PULSE_PICKER_TRIGGER_SYNC,
e_EXTERNAL_MODULATOR_TRIGGER_SYNC,
e_EXTERNAL_MODULATOR_GATE_SYNC,
e_PULSE_PICKER_ALIGNMENT_SYNC,
e_EXTERNAL_MODULATOR_ALIGNMENT_SYNC,
e_EXTERNAL_MODULATOR_EFFICIENCY_MODE,
e_COMPRESSOR_MODE,
e_MAX,
}
public enum e_DISCRETE_INPUT
{
e_OSCILLATOR_READY,
e_INTERLOCK,
e_KEY,
e_MODE_LOCK,
e_FRONT_END_READY,
e_SHUTTER,
e_MAX,
}
public enum e_HOLDING_REGISTER
{
e_RESET,
e_AMPLIFIER_LD_SET_CURRENT,
e_BURST_MODE,
e_PULSE_PICKER_FREQUENCY_SET,
e_EXTERNAL_MODULATOR_WIDTH,
e_EXTERNAL_MODULATOR_DELAY,
e_EXTERNAL_MODULATOR_FREQUENCY_SET,
e_EXTERNAL_MODULATOR_EFFICIENCY,
e_MAX = 11,
}
public enum e_INPUT_REGISTER
{
e_DIODE_AMPLIFIER_RUNTIME,
e_OSCILLATOR_LD_CURRENT,
e_OSCILLATOR_LD_TEMP,
e_OSCILLATOR_LD_POWER,
e_PREAMP1_LD_CURRENT,
e_PREAMP1_LD_TEMP,
e_PREAMP1_LD_POWER,
e_AMPLIFIER_LD_CURRENT,
e_AMPLIFIER_LD_POWER,
e_AMPLIFIER_LD_TEMP,
e_PULSE_PICKER_FREQUENCY,
e_EXTERNAL_MODULATOR_FREQUENCY,
e_OUTPUPT_POWER = 12,
e_MAX = 19,
}
bool[] m_bCoilInputs = new bool[(int)e_COIL_INPUT.e_MAX];
int[] m_bCoilInputs_For_Write = new int[(int)e_COIL_INPUT.e_MAX] { -1, -1, -1, -1, -1, -1, -1, -1, -1 };
bool[] m_bDiscreteInputs = new bool[(int)e_DISCRETE_INPUT.e_MAX];
ushort[] m_usHoldingRegisteres = new ushort[(int)e_HOLDING_REGISTER.e_MAX];
short[] m_usHoldingRegisteres_For_Write = new short[(int)e_HOLDING_REGISTER.e_MAX] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
ushort[] m_usInputRegisteres = new ushort[(int)e_INPUT_REGISTER.e_MAX];
public bool[] CoilInputs {
get { return m_bCoilInputs; }
set { m_bCoilInputs = value; }
}
public int[] CoilInputs_For_Write {
get { return m_bCoilInputs_For_Write; }
set { m_bCoilInputs_For_Write = value; }
}
public bool[] DiscreteInputs {
get { return m_bDiscreteInputs; }
set { m_bDiscreteInputs = value; }
}
public ushort[] HoldingRegisteres {
get { return m_usHoldingRegisteres; }
set { m_usHoldingRegisteres = value; }
}
public short[] HoldingRegisteres_For_Write {
get { return m_usHoldingRegisteres_For_Write; }
set { m_usHoldingRegisteres_For_Write = value; }
}
public ushort[] InputRegisteres {
get { return m_usInputRegisteres; }
set { m_usInputRegisteres = value; }
}
private bool IsRunning = false;
public int RetryCount = 0;
private object m_SyncLock = new object();
private int MaxCount;
public LaserSatsumaDisplay(bool isSimul) : base(isSimul)
{
IsSimul = isSimul;
CommType = CommunicationType.ModbusTCP;
}
protected override int DoActivate(IDeviceConfig config)
{
if (IsActivated) {
return E1.OK;
}
var satsumaConfig = (config as LaserSatsumaConfig);
MaxCount = satsumaConfig.RetryCount;
if (IsSimul) {
return E1.OK;
}
var res = base.DoActivate(config);
if (res == E1.OK) {
RunMonitor(satsumaConfig.ScanIntervalMS);
} else {
IsCommError = true;
}
return res;
}
protected override int DoDeactivate()
{
IsRunning = false;
if (!IsActivated || IsSimul) {
return E1.OK;
}
return base.DoDeactivate();
}
public void StopMonitor()
{
IsRunning = false;
}
public void RunMonitor(int scanIntervalMS)
{
IsRunning = true;
// 실시간 update
Task.Run(() => {
while (IsActivated && IsRunning && !IsCommError) {
int res = E1.OK;
res |= ModbusTcpMasterRead();
res |= ModbusTcpMasterWrite();
if (res != E1.OK) {
RetryCount++;
} else {
RetryCount = 0;
}
CheckRetryCount();
Thread.Sleep(scanIntervalMS);
}
});
}
private void CheckRetryCount()
{
if (MaxCount < RetryCount) {
IsCommError = true;
} else {
IsCommError = false;
}
}
private int ModbusTcpMasterRead()
{
int res = E1.OK;
// Read Coil
var bCoilInput = ReadBitBlock(0, (int)e_COIL_INPUT.e_MAX);
lock (m_SyncLock) {
Buffer.BlockCopy(bCoilInput.bits, 0, m_bCoilInputs, 0, (int)e_COIL_INPUT.e_MAX);
}
res |= bCoilInput.err;
// Read Discrete Input
var bDiscreteInput = ReadInputBitBlock(0, (int)e_DISCRETE_INPUT.e_MAX);
if (bDiscreteInput.err == E1.OK) {
Buffer.BlockCopy(bDiscreteInput.bits, 0, m_bDiscreteInputs, 0, (int)e_DISCRETE_INPUT.e_MAX);
}
res |= bDiscreteInput.err;
// Read Holding Register
var usHoldingRegister = ReadWordBlock(0, (int)e_HOLDING_REGISTER.e_MAX);
lock (m_SyncLock) {
Buffer.BlockCopy(usHoldingRegister.words, 0, m_usHoldingRegisteres, 0, (int)e_HOLDING_REGISTER.e_MAX * 2);
}
res |= usHoldingRegister.err;
// Read Input Register
var usInputRegister = ReadInputWordBlock(0, (int)e_INPUT_REGISTER.e_MAX);
lock (m_SyncLock) {
Buffer.BlockCopy(usInputRegister.words, 0, m_usInputRegisteres, 0, (int)e_INPUT_REGISTER.e_MAX * 2);
}
res |= usHoldingRegister.err;
return res;
}
private int ModbusTcpMasterWrite()
{
int res = E1.OK;
for (int i = 0; i < (int)e_COIL_INPUT.e_MAX; i++) {
if (CoilInputs_For_Write[i] != -1) {
if (CoilInputs_For_Write[i] == 0) {
res |= WriteBit((ushort)i, CoilInputs_For_Write[i] == 1);
}
CoilInputs_For_Write[i] = -1;
}
}
for (int i = 0; i < (int)e_HOLDING_REGISTER.e_MAX; i++) {
if (m_usHoldingRegisteres_For_Write[i] != -1) {
res |= WriteWord((ushort)i, m_usHoldingRegisteres_For_Write[i]);
m_usHoldingRegisteres_For_Write[i] = -1;
}
}
return res;
}
public void SetPulsePickerAlignment(eLaserAlignment eAlignment)
{
if (eAlignment == eLaserAlignment.NO) {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_PULSE_PICKER_ALIGNMENT_SYNC] = 0;
} else {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_PULSE_PICKER_ALIGNMENT_SYNC] = 1;
}
}
public void SetTrigger(eLaserTrigger eTrigger)
{
if (eTrigger == eLaserTrigger.EXTERNAL) {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_TRIGGER_SYNC] = 0;
} else {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_TRIGGER_SYNC] = 1;
}
}
public void SetPulsePickerTrigger(eLaserTrigger eTrigger)
{
if (eTrigger == eLaserTrigger.EXTERNAL) {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_PULSE_PICKER_TRIGGER_SYNC] = 0;
} else {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_PULSE_PICKER_TRIGGER_SYNC] = 1;
}
}
public void SetGate(eLaserGate eGate)
{
if (eGate == eLaserGate.EXTERNAL) {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_GATE_SYNC] = 0;
} else {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_GATE_SYNC] = 1;
}
}
public void SetAlignment(eLaserAlignment eAlignment)
{
if (eAlignment == eLaserAlignment.NO) {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_ALIGNMENT_SYNC] = 0;
} else {
CoilInputs_For_Write[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_ALIGNMENT_SYNC] = 1;
}
}
public int SetWidth(short usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_WIDTH] = usValue;
return 1;
}
public int SetDelay(short usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_DELAY] = usValue;
return 1;
}
public int SetFrequency(short usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_FREQUENCY_SET] = usValue;
return 1;
}
public int SetPulsePickerFrequencyMin(ushort usValue)
{
//HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_FREQUENCY_SET] = usValue;
return 1;
}
public int SetTransmissionPercent(ushort usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_EFFICIENCY] = (short)usValue;
return 1;
}
public int SetPulsePickerFrequency(short usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_PULSE_PICKER_FREQUENCY_SET] = usValue;
return 1;
}
public int SetBurstMode(short usValue)
{
HoldingRegisteres_For_Write[(int)e_HOLDING_REGISTER.e_BURST_MODE] = usValue;
return 1;
}
public ushort GetPulsePickerFrequency()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_PULSE_PICKER_FREQUENCY_SET];
}
public bool GetPulsePickerTrigger()
{
return CoilInputs[(int)e_COIL_INPUT.e_PULSE_PICKER_TRIGGER_SYNC];
}
public bool GetPulsePickerAlignment()
{
return CoilInputs[(int)e_COIL_INPUT.e_PULSE_PICKER_ALIGNMENT_SYNC];
}
public ushort GetBurstMode()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_BURST_MODE];
}
public ushort GetWidth()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_WIDTH];
}
public ushort GetDelay()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_DELAY];
}
public ushort GetFrequency()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_FREQUENCY_SET];
}
public bool GetTrigger()
{
return CoilInputs[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_TRIGGER_SYNC];
}
public bool GetGate()
{
return CoilInputs[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_GATE_SYNC];
}
public bool GetAlignment()
{
return CoilInputs[(int)e_COIL_INPUT.e_EXTERNAL_MODULATOR_ALIGNMENT_SYNC];
}
public ushort GetTransmissionPercent()
{
return HoldingRegisteres[(int)e_HOLDING_REGISTER.e_EXTERNAL_MODULATOR_EFFICIENCY];
}
}
}