 dc66158497
			
		
	
	dc66158497
	
	
	
		
			
			- Added QRValidation vision control system - Includes CapCleaningControl UI components - WebSocket-based barcode validation system - Support for Crevis PLC integration - Test projects for PLC emulator, motion, IO panel, and Modbus 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| 
 | |
| namespace Project
 | |
| {
 | |
| 	public class CInterLock
 | |
| 	{
 | |
| 		UInt64 offsetValue = 0x01;
 | |
| 		public object Tag { get; set; }
 | |
| 		public string errorMessage;
 | |
| 		protected UInt64 _value;
 | |
| 
 | |
| 		public UInt64 Value { get { return _value; } set { _value = value; } }
 | |
| 
 | |
| 		public event EventHandler<ValueEventArgs> ValueChanged;
 | |
| 		public class ValueEventArgs : EventArgs
 | |
| 		{
 | |
| 			private int _arridx;
 | |
| 			private Boolean _oldvalue;
 | |
| 			private Boolean _newvalue;
 | |
| 			private string _reason;
 | |
| 
 | |
| 			public int ArrIDX { get { return _arridx; } }
 | |
| 			public Boolean OldValue { get { return _oldvalue; } }
 | |
| 			public Boolean NewValue { get { return _newvalue; } }
 | |
| 			public string Reason { get { return _reason; } }
 | |
| 			public Boolean NewOn { get; set; }
 | |
| 			public Boolean NewOff { get; set; }
 | |
| 
 | |
| 			public ValueEventArgs(int arridx, Boolean oldvalue, Boolean newvalue, string reason_, Boolean newon_, Boolean newof_)
 | |
| 			{
 | |
| 				_arridx = arridx;
 | |
| 				_oldvalue = oldvalue;
 | |
| 				_newvalue = newvalue;
 | |
| 				_reason = reason_;
 | |
| 				this.NewOn = newon_;
 | |
| 				this.NewOff = newon_;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public CInterLock(object tag = null)
 | |
| 		{
 | |
| 			errorMessage = string.Empty;
 | |
| 			_value = 0;
 | |
| 			this.Tag = tag;
 | |
| 		}
 | |
| 
 | |
| 		public Boolean get(int idx)
 | |
| 		{
 | |
| 			if (idx >= 64)
 | |
| 				throw new Exception("flag는 최대 64개를 지원 합니다");
 | |
| 
 | |
| 			var offset = (UInt64)(offsetValue << idx);
 | |
| 			return (_value & offset) != 0;
 | |
| 		}
 | |
| 		public void set(int idx, Boolean value, string reason)
 | |
| 		{
 | |
| 			if (idx >= 64)
 | |
| 				throw new Exception("flag는 최대 64개를 지원 합니다");
 | |
| 
 | |
| 			var oldvalue = get(idx);
 | |
| 			var raw_old = _value;
 | |
| 			if (value)
 | |
| 			{
 | |
| 				var offset = (UInt64)(offsetValue << idx);
 | |
| 				_value = _value | offset;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				var shiftvalue = (UInt64)(offsetValue << idx);
 | |
| 				UInt64 offset = ~shiftvalue;
 | |
| 				_value = _value & offset;
 | |
| 			}
 | |
| 
 | |
| 			if (oldvalue != value)
 | |
| 			{
 | |
| 				Boolean NewOn = (raw_old == 0 && _value > 0);
 | |
| 				Boolean NewOf = (raw_old != 0 && _value == 0);
 | |
| 				if (ValueChanged != null)
 | |
| 					ValueChanged(this, new ValueEventArgs(idx, oldvalue, value, reason, NewOn, NewOf));
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				//Pub.log.Add(" >> SKIP");
 | |
| 				//if (string.IsNullOrEmpty(reason) == false)
 | |
| 				//Pub.log.Add("#### FLAG변경(값이 같아서 처리 안함) : idx=" + idx.ToString() + ",값:" + value.ToString() + ",사유:" + reason);
 | |
| 			}
 | |
| 		}
 | |
| 		public void Toggle(int idx, string reason = "")
 | |
| 		{
 | |
| 			var curValue = get(idx);
 | |
| 			set(idx, !curValue, reason);
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| }
 |