This commit is contained in:
atvstdla
2025-10-02 14:38:46 +09:00
parent 9887cc7540
commit b707eee6ea
20 changed files with 1980 additions and 1 deletions

Submodule Handler/swPLC deleted from 0e85ca8c24

63
Handler/swPLC/.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

8
Handler/swPLC/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
*.suo
*.user
*.pdb
bin
obj
desktop.ini
.vs
packages

34
Handler/swPLC/CSetting.cs Normal file
View File

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AR;
namespace Project
{
public class CSetting : AR.Setting
{
#region "swplc"
public string swplc_name { get; set; }
public int swplc_size { get; set; }
#endregion
public CSetting()
{
}
public override void AfterLoad()
{
if (swplc_size < 1) swplc_size = 100;
if (swplc_name.isEmpty()) swplc_name = "swplc";
}
public override void AfterSave()
{
}
}
}

402
Handler/swPLC/Form1.Designer.cs generated Normal file
View File

@@ -0,0 +1,402 @@
namespace Project
{
partial class Form1
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
this.logTextBox1 = new arCtl.LogTextBox();
this.gridView1 = new arCtl.GridView.GridView();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.button5 = new System.Windows.Forms.Button();
this.button6 = new System.Windows.Forms.Button();
this.button7 = new System.Windows.Forms.Button();
this.button8 = new System.Windows.Forms.Button();
this.button9 = new System.Windows.Forms.Button();
this.button10 = new System.Windows.Forms.Button();
this.button11 = new System.Windows.Forms.Button();
this.button12 = new System.Windows.Forms.Button();
this.button13 = new System.Windows.Forms.Button();
this.ioPanel1 = new arDev.AjinEXTEK.UI.IOPanel();
this.statusStrip1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// timer1
//
this.timer1.Interval = 250;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel1,
this.toolStripStatusLabel2,
this.toolStripStatusLabel3});
this.statusStrip1.Location = new System.Drawing.Point(0, 564);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(760, 22);
this.statusStrip1.TabIndex = 2;
this.statusStrip1.Text = "statusStrip1";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(73, 17);
this.toolStripStatusLabel1.Text = "AutoControl";
this.toolStripStatusLabel1.Click += new System.EventHandler(this.toolStripStatusLabel1_Click);
//
// toolStripStatusLabel2
//
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
this.toolStripStatusLabel2.Size = new System.Drawing.Size(118, 17);
this.toolStripStatusLabel2.Text = "toolStripStatusLabel2";
//
// toolStripStatusLabel3
//
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
this.toolStripStatusLabel3.Size = new System.Drawing.Size(118, 17);
this.toolStripStatusLabel3.Text = "toolStripStatusLabel3";
//
// logTextBox1
//
this.logTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24)))));
this.logTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.logTextBox1.ColorList = new arCtl.sLogMessageColor[0];
this.logTextBox1.DateFormat = "mm:ss.fff";
this.logTextBox1.DefaultColor = System.Drawing.Color.LightGray;
this.logTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.logTextBox1.EnableDisplayTimer = true;
this.logTextBox1.EnableGubunColor = true;
this.logTextBox1.Font = new System.Drawing.Font("Consolas", 9F);
this.logTextBox1.ListFormat = "[{0}] {1}";
this.logTextBox1.Location = new System.Drawing.Point(0, 116);
this.logTextBox1.MaxListCount = ((ushort)(200));
this.logTextBox1.MaxTextLength = ((uint)(4000u));
this.logTextBox1.MessageInterval = 50;
this.logTextBox1.Name = "logTextBox1";
this.logTextBox1.Size = new System.Drawing.Size(760, 193);
this.logTextBox1.TabIndex = 0;
this.logTextBox1.Text = "";
//
// gridView1
//
this.gridView1.arVeriticalDraw = false;
this.gridView1.BorderColor = System.Drawing.Color.Black;
this.gridView1.BorderSize = 0;
this.gridView1.ColorList = null;
this.gridView1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.gridView1.FontPin = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
this.gridView1.ForeColorPin = System.Drawing.Color.WhiteSmoke;
this.gridView1.Location = new System.Drawing.Point(0, 309);
this.gridView1.MatrixSize = new System.Drawing.Point(3, 5);
this.gridView1.MenuBorderSize = 1;
this.gridView1.MenuGap = 5;
this.gridView1.MinimumSize = new System.Drawing.Size(100, 50);
this.gridView1.Name = "gridView1";
this.gridView1.Names = null;
this.gridView1.ShadowColor = System.Drawing.Color.Transparent;
this.gridView1.showDebugInfo = false;
this.gridView1.ShowIndexString = true;
this.gridView1.ShowNameString = true;
this.gridView1.ShowValueString = true;
this.gridView1.Size = new System.Drawing.Size(760, 100);
this.gridView1.TabIndex = 3;
this.gridView1.Tags = null;
this.gridView1.Text = "gridView1";
this.gridView1.TextAttachToImage = true;
this.gridView1.Titles = null;
this.gridView1.Values = null;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 3;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33332F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel1.Controls.Add(this.button1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.button2, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.button3, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.button4, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.button5, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.button6, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.button7, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.button8, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.button9, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.button10, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.button11, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.button12, 2, 3);
this.tableLayoutPanel1.Controls.Add(this.button13, 0, 4);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 409);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 19.99851F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(760, 155);
this.tableLayoutPanel1.TabIndex = 4;
//
// button1
//
this.button1.Dock = System.Windows.Forms.DockStyle.Fill;
this.button1.Location = new System.Drawing.Point(3, 34);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(247, 25);
this.button1.TabIndex = 0;
this.button1.Tag = "0";
this.button1.Text = "Refresh Port";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Dock = System.Windows.Forms.DockStyle.Fill;
this.button2.Location = new System.Drawing.Point(509, 34);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(248, 25);
this.button2.TabIndex = 0;
this.button2.Tag = "2";
this.button2.Text = "Refresh Port";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button1_Click);
//
// button3
//
this.button3.Dock = System.Windows.Forms.DockStyle.Fill;
this.button3.Location = new System.Drawing.Point(256, 34);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(247, 25);
this.button3.TabIndex = 0;
this.button3.Tag = "1";
this.button3.Text = "Refresh Port";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.button1_Click);
//
// button4
//
this.button4.Dock = System.Windows.Forms.DockStyle.Fill;
this.button4.Location = new System.Drawing.Point(3, 3);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(247, 25);
this.button4.TabIndex = 1;
this.button4.Tag = "0";
this.button4.Text = "Up";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// button5
//
this.button5.Dock = System.Windows.Forms.DockStyle.Fill;
this.button5.Location = new System.Drawing.Point(256, 3);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(247, 25);
this.button5.TabIndex = 1;
this.button5.Tag = "1";
this.button5.Text = "Up";
this.button5.UseVisualStyleBackColor = true;
this.button5.Click += new System.EventHandler(this.button4_Click);
//
// button6
//
this.button6.Dock = System.Windows.Forms.DockStyle.Fill;
this.button6.Location = new System.Drawing.Point(509, 3);
this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(248, 25);
this.button6.TabIndex = 1;
this.button6.Tag = "2";
this.button6.Text = "Up";
this.button6.UseVisualStyleBackColor = true;
this.button6.Click += new System.EventHandler(this.button4_Click);
//
// button7
//
this.button7.Dock = System.Windows.Forms.DockStyle.Fill;
this.button7.Location = new System.Drawing.Point(509, 65);
this.button7.Name = "button7";
this.button7.Size = new System.Drawing.Size(248, 25);
this.button7.TabIndex = 1;
this.button7.Tag = "2";
this.button7.Text = "Down";
this.button7.UseVisualStyleBackColor = true;
this.button7.Click += new System.EventHandler(this.button9_Click);
//
// button8
//
this.button8.Dock = System.Windows.Forms.DockStyle.Fill;
this.button8.Location = new System.Drawing.Point(256, 65);
this.button8.Name = "button8";
this.button8.Size = new System.Drawing.Size(247, 25);
this.button8.TabIndex = 1;
this.button8.Tag = "1";
this.button8.Text = "Down";
this.button8.UseVisualStyleBackColor = true;
this.button8.Click += new System.EventHandler(this.button9_Click);
//
// button9
//
this.button9.Dock = System.Windows.Forms.DockStyle.Fill;
this.button9.Location = new System.Drawing.Point(3, 65);
this.button9.Name = "button9";
this.button9.Size = new System.Drawing.Size(247, 25);
this.button9.TabIndex = 1;
this.button9.Tag = "0";
this.button9.Text = "Down";
this.button9.UseVisualStyleBackColor = true;
this.button9.Click += new System.EventHandler(this.button9_Click);
//
// button10
//
this.button10.Dock = System.Windows.Forms.DockStyle.Fill;
this.button10.Location = new System.Drawing.Point(3, 96);
this.button10.Name = "button10";
this.button10.Size = new System.Drawing.Size(247, 24);
this.button10.TabIndex = 2;
this.button10.Tag = "0";
this.button10.Text = "Stop";
this.button10.UseVisualStyleBackColor = true;
this.button10.Click += new System.EventHandler(this.button12_Click);
//
// button11
//
this.button11.Dock = System.Windows.Forms.DockStyle.Fill;
this.button11.Location = new System.Drawing.Point(256, 96);
this.button11.Name = "button11";
this.button11.Size = new System.Drawing.Size(247, 24);
this.button11.TabIndex = 2;
this.button11.Tag = "1";
this.button11.Text = "Stop";
this.button11.UseVisualStyleBackColor = true;
this.button11.Click += new System.EventHandler(this.button12_Click);
//
// button12
//
this.button12.Dock = System.Windows.Forms.DockStyle.Fill;
this.button12.Location = new System.Drawing.Point(509, 96);
this.button12.Name = "button12";
this.button12.Size = new System.Drawing.Size(248, 24);
this.button12.TabIndex = 2;
this.button12.Tag = "2";
this.button12.Text = "Stop";
this.button12.UseVisualStyleBackColor = true;
this.button12.Click += new System.EventHandler(this.button12_Click);
//
// button13
//
this.tableLayoutPanel1.SetColumnSpan(this.button13, 3);
this.button13.Dock = System.Windows.Forms.DockStyle.Fill;
this.button13.Location = new System.Drawing.Point(3, 126);
this.button13.Name = "button13";
this.button13.Size = new System.Drawing.Size(754, 26);
this.button13.TabIndex = 3;
this.button13.Text = "Exit";
this.button13.UseVisualStyleBackColor = true;
this.button13.Click += new System.EventHandler(this.button13_Click);
//
// ioPanel1
//
this.ioPanel1.BorderColor = System.Drawing.Color.Empty;
this.ioPanel1.BorderSize = 0;
this.ioPanel1.ColorList = null;
this.ioPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.ioPanel1.FontPin = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold);
this.ioPanel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
this.ioPanel1.ForeColorPin = System.Drawing.Color.WhiteSmoke;
this.ioPanel1.Location = new System.Drawing.Point(0, 0);
this.ioPanel1.MatrixSize = new System.Drawing.Point(3, 6);
this.ioPanel1.MenuBorderSize = 1;
this.ioPanel1.MenuGap = 5;
this.ioPanel1.MinimumSize = new System.Drawing.Size(100, 50);
this.ioPanel1.Name = "ioPanel1";
this.ioPanel1.ShadowColor = System.Drawing.Color.Transparent;
this.ioPanel1.showDebugInfo = false;
this.ioPanel1.ShowPinName = true;
this.ioPanel1.Size = new System.Drawing.Size(760, 116);
this.ioPanel1.TabIndex = 0;
this.ioPanel1.TextAttachToImage = true;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(760, 586);
this.Controls.Add(this.logTextBox1);
this.Controls.Add(this.gridView1);
this.Controls.Add(this.ioPanel1);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.statusStrip1);
this.MaximizeBox = false;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private arCtl.LogTextBox logTextBox1;
private System.Windows.Forms.Timer timer1;
private arDev.AjinEXTEK.UI.IOPanel ioPanel1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
private arCtl.GridView.GridView gridView1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.Button button6;
private System.Windows.Forms.Button button7;
private System.Windows.Forms.Button button8;
private System.Windows.Forms.Button button9;
private System.Windows.Forms.Button button10;
private System.Windows.Forms.Button button11;
private System.Windows.Forms.Button button12;
private System.Windows.Forms.Button button13;
}
}

762
Handler/swPLC/Form1.cs Normal file
View File

@@ -0,0 +1,762 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;
using AR;
namespace Project
{
public partial class Form1 : Form
{
AR.Log log;
arDev.DIO.IDIO dio;
StateMachine sm;
AR.MemoryMap.Server swplc;
bool exitforce = false;
byte[] buffer = new byte[16];
public Form1()
{
InitializeComponent();
this.Text = $"{Application.ProductName} ver {Application.ProductVersion}";
log = new AR.Log();
log.RaiseMsg += (p1, p2, p3) => { this.logTextBox1.AddMsg(p1, p2, p3); };
this.FormClosing += Form1_FormClosing;
this.logTextBox1.ColorList = new arCtl.sLogMessageColor[] {
new arCtl.sLogMessageColor("NORM",Color.Yellow),
new arCtl.sLogMessageColor("ERR",Color.Red),
new arCtl.sLogMessageColor("WARN",Color.Tomato),
new arCtl.sLogMessageColor("INFO",Color.LightSkyBlue)
};
List<string> piname = new List<String>();
List<string> titles = new List<String>();
List<bool> values = new List<bool>();
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","Emergency",
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTL_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTL_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTL_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTL_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTL_MOT_RUN).ToString("X2"),"--"
});
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","--",
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTC_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTC_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTC_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTC_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTC_MOT_RUN).ToString("X2"),"--"
});
titles.AddRange(new string[] {
"Upper Limit","Reel Detect","Lower Limit",
"Motor Direction(1=DN,0=UP)","Motor Run","--"
});
piname.AddRange(new string[] {
"X"+((int)eDIName.PORTR_LIM_UP).ToString("X2"),
"X"+((int)eDIName.PORTR_DET_UP).ToString("X2"),
"X"+((int)eDIName.PORTR_LIM_DN).ToString("X2"),
"Y"+((int)eDOName.PORTR_MOT_DIR).ToString("X2"),
"Y"+((int)eDOName.PORTR_MOT_RUN).ToString("X2"),"--"
});
for (int i = 0; i < titles.Count; i++)
values.Add(false);
ioPanel1.ColorList = new arDev.AjinEXTEK.UI.ColorListItem[] {
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.DimGray, BackColor2 = Color.FromArgb(30,30,30), Remark="False" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.Lime, BackColor2 = Color.Green, Remark="True" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.Magenta, BackColor2 = Color.Green, Remark="True" },
new arDev.AjinEXTEK.UI.ColorListItem{ BackColor1 = Color.SkyBlue, BackColor2 = Color.LightSkyBlue, Remark="True" },
};
this.ioPanel1.setTitle(titles.ToArray());
this.ioPanel1.setNames(piname.ToArray());
this.ioPanel1.setValue(values.ToArray());
this.ioPanel1.Invalidate();
//내부버퍼확인
titles.Clear();
piname.Clear();
var valueb = new List<ushort>();
for (int i = 0; i < 16; i++)
{
var addr = (eswPLCAddr)i;
piname.Add(i.ToString("X2"));
titles.Add(addr.ToString());
valueb.Add(0);
}
gridView1.ColorList = new arCtl.GridView.ColorListItem[] {
new arCtl.GridView.ColorListItem{ BackColor1 = Color.DimGray, BackColor2 = Color.FromArgb(30,30,30), Remark="False" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.Lime, BackColor2 = Color.Green, Remark="True" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.Magenta, BackColor2 = Color.Green, Remark="True" },
new arCtl.GridView.ColorListItem{ BackColor1 = Color.SkyBlue, BackColor2 = Color.LightSkyBlue, Remark="True" },
};
this.gridView1.setTitle(titles.ToArray());
this.gridView1.setNames(piname.ToArray());
this.gridView1.setValue(valueb.ToArray());
this.gridView1.ShowValueString = true;
this.gridView1.ShowNameString = true;
this.gridView1.ShowIndexString = false;
this.gridView1.Invalidate();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (exitforce == false)
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
return;
}
timer1.Stop();
dio.Dispose();
sm.Stop();
log.AddI("Program terminated");
log.Flush();
}
private void Form1_Load(object sender, EventArgs e)
{
log.AddI("Program started");
dio = new arDev.AjinEXTEK.DIO(arDev.AjinEXTEK.ELibraryType.AXT);// arDev.AjinEXTEK.DIO();
if (dio.Init())
{
dio.IOValueChanged += Dio_IOValueChanged;
dio.RunMonitor();
log.Add($"DI:{dio.GetDICount}/DO:{dio.GetDOCount}");
}
else log.AddE($"DIO initialization failed");
swplc = new AR.MemoryMap.Server(PUB.Setting.swplc_name, PUB.Setting.swplc_size);
swplc.ValueChanged += Plc_ValueChanged;
swplc.Start();
ioPanel1.ItemClick += IoPanel1_ItemClick;
sm = new AR.StateMachine();
sm.StepChanged += Sm_StepChanged;
sm.Running += Sm_Running;
sm.SPS += Sm_SPS;
if (dio.IsInit == false) log.AddE($"DIO initialization failed");
log.Add($"State machine started");
sm.Start();
sm.SetNewStep((byte)eSMStep.RUN);
this.starttime = DateTime.Now;
timer1.Start();
}
private void Plc_ValueChanged(object sender, AR.MemoryMap.Core.monitorvalueargs e)
{
}
private void Dio_IOValueChanged(object sender, arDev.DIO.IOValueEventArgs e)
{
if (e.Direction == arDev.DIO.eIOPINDIR.INPUT)
{
var pin = (eDIName)e.ArrIDX;
//센서가 활성화될때는 이값을 설정해준다
//나머지조건은 autocontrol 에서 처리된다.
var value = GetDIValue(pin);
if (value)
{
if (pin == eDIName.PORTL_LIM_DN) WriteBuffer(eswPLCAddr.LPort, 1);
if (pin == eDIName.PORTL_DET_UP) WriteBuffer(eswPLCAddr.LPort, 2);
if (pin == eDIName.PORTL_LIM_UP) WriteBuffer(eswPLCAddr.LPort, 3);
if (pin == eDIName.PORTC_LIM_DN) WriteBuffer(eswPLCAddr.CPort, 1);
if (pin == eDIName.PORTC_DET_UP) WriteBuffer(eswPLCAddr.CPort, 2);
if (pin == eDIName.PORTC_LIM_UP) WriteBuffer(eswPLCAddr.CPort, 3);
if (pin == eDIName.PORTR_LIM_DN) WriteBuffer(eswPLCAddr.RPort, 1);
if (pin == eDIName.PORTR_DET_UP) WriteBuffer(eswPLCAddr.RPort, 2);
if (pin == eDIName.PORTR_LIM_UP) WriteBuffer(eswPLCAddr.RPort, 3);
}
}
else
{
var pin = (eDOName)e.ArrIDX;
if (pin == eDOName.PORTL_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.LMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTL_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.LMotor, (byte)value);
}
}
else if (pin == eDOName.PORTC_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.CMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTC_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.CMotor, (byte)value);
}
}
else if (pin == eDOName.PORTR_MOT_RUN)
{
if (e.NewValue == false) WriteBuffer(eswPLCAddr.RMotor, 3);
else
{
//방향을 확인해야한다
var value = GetDOValue(eDOName.PORTR_MOT_DIR) ? 2 : 1;
WriteBuffer(eswPLCAddr.RMotor, (byte)value);
}
}
}
}
private void IoPanel1_ItemClick(object sender, arDev.AjinEXTEK.UI.IOPanel.ItemClickEventArgs e)
{
if (dio != null && dio.IsInit == false) return;
var name = this.ioPanel1.Names[e.idx];
if (name.StartsWith("Y"))
{
var pinno = Convert.ToInt32(name.Substring(1), 16);
var pin = (eDOName)pinno;
var cur = dio.GetDOValue(pinno);
dio.SetOutput(pinno, !cur);
log.Add($"value change [X{pinno:X2}] {pin} to {!cur}");
}
}
bool GetDOValue(eDOName pin)
{
return dio.GetDOValue((int)pin);
}
bool GetDIValue(eDIName pin)
{
if (pin == eDIName.PORTL_LIM_DN || pin == eDIName.PORTC_LIM_DN || pin == eDIName.PORTR_LIM_DN)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.PORTL_LIM_UP || pin == eDIName.PORTC_LIM_UP || pin == eDIName.PORTR_LIM_UP)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.PORTL_DET_UP || pin == eDIName.PORTC_DET_UP || pin == eDIName.PORTR_DET_UP)
{
return !dio.GetDIValue((int)pin);
}
else if (pin == eDIName.BUT_EMGF)
{
return !dio.GetDIValue((int)pin);
}
else return dio.GetDIValue((int)pin);
}
private void Sm_SPS(object sender, EventArgs e)
{
//limit 센서에 의해 자동 멈춤
if (swplc.Init)
{
AutoStop();
WriteBuffer();
CommandProcess();
}
}
void CommandProcess()
{
//시스템 상태값 0:7 기록
swplc.Write(0, buffer, 0, 12);
//명령어 가져오기 7:3개의 데이터 확인
if (swplc.ReadBytes(12, 3, out byte[] plcbuffer))
{
//내부버퍼에 상태를 기록한다
Array.Copy(plcbuffer, 0, this.buffer, 12, plcbuffer.Length);
}
//command value
var lcmd = ReadBuffer(eswPLCAddr.LCmd);
var ccmd = ReadBuffer(eswPLCAddr.CCmd);
var rcmd = ReadBuffer(eswPLCAddr.RCmd);
//left command check
if (lcmd == 1) MotorControl(eMotList.Left, eMotControl.Down);
else if (lcmd == 2) MotorControl(eMotList.Left, eMotControl.Up);
else if (lcmd == 3) MotorControl(eMotList.Left, eMotControl.Stop);
else if (lcmd == 4) MotorRefresh(eMotList.Left);
if (lcmd < 4 && ReadBuffer(eswPLCAddr.LSts) != 0) WriteBuffer(eswPLCAddr.LSts, 0);
//center command check
if (ccmd == 1) MotorControl(eMotList.Center, eMotControl.Down);
else if (ccmd == 2) MotorControl(eMotList.Center, eMotControl.Up);
else if (ccmd == 3) MotorControl(eMotList.Center, eMotControl.Stop);
else if (ccmd == 4) MotorRefresh(eMotList.Center);
if (ccmd < 4 && ReadBuffer(eswPLCAddr.CSts) != 0) WriteBuffer(eswPLCAddr.CSts, 0);
//right command check
if (rcmd == 1) MotorControl(eMotList.Right, eMotControl.Down);
else if (rcmd == 2) MotorControl(eMotList.Right, eMotControl.Up);
else if (rcmd == 3) MotorControl(eMotList.Right, eMotControl.Stop);
else if (rcmd == 4) MotorRefresh(eMotList.Right);
if (rcmd < 4 && ReadBuffer(eswPLCAddr.RSts) != 0) WriteBuffer(eswPLCAddr.RSts, 0);
}
/// <summary>
/// 모터를 down -> up 합니다.
/// </summary>
/// <param name="mot"></param>
/// <param name="cmd"></param>
void MotorRefresh(eMotList mot)
{
eswPLCAddr address = (eswPLCAddr)((int)eswPLCAddr.LSts + (int)mot);
var Sts = ReadBuffer(address);
//상태값을 변경한다
if (Sts == 0) //처음시작하는경우이다
{
motortime[(int)mot] = DateTime.Now;
MotorControl(mot, eMotControl.Down);
WriteBuffer(address, 1);
log.Add($"Motor[{mot}] Refresh #1 : Down,Addr={address}");
}
else if (Sts == 1) //3초간 내린다. 센서가 감지되면 계속 내려야 한다
{
//low limit check
if (mot == eMotList.Left && GetDIValue(eDIName.PORTL_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Center && GetDIValue(eDIName.PORTC_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Right && GetDIValue(eDIName.PORTR_LIM_DN))
{
log.Add($"Motor[{mot}] Refresh #2 : Down Limit,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
else if (mot == eMotList.Left && GetDIValue(eDIName.PORTL_DET_UP))
{
return;
}
else if (mot == eMotList.Center && GetDIValue(eDIName.PORTC_DET_UP))
{
return;
}
else if (mot == eMotList.Right && GetDIValue(eDIName.PORTR_DET_UP))
{
return;
}
else
{
var ts = DateTime.Now - motortime[(int)mot];
if (ts.TotalSeconds > 3)
{
log.Add($"Motor[{mot}] Refresh #2 : Down Time Over,Addr={address}");
MotorControl(mot, eMotControl.Stop);
WriteBuffer(address, 2);
}
}
}
else if (Sts == 2) //다시 올린다
{
log.Add($"Motor[{mot}] Refresh #3 : Up Addr={address}");
MotorControl(mot, eMotControl.Up);
motortime[(int)mot] = DateTime.Now;
WriteBuffer(address, 3);
}
else if (Sts == 3) //올라가는건
{
WriteBuffer(address, 0);
eswPLCAddr addressCmd = (eswPLCAddr)((int)eswPLCAddr.LCmd + (int)mot);
if (addressCmd == eswPLCAddr.CCmd)
{
}
log.Add($"Refresh[{mot}] Complete Addr={address}/{addressCmd} Reset");
swplc.Write((int)addressCmd, 0);
}
}
int[] motorseq = new int[] { 0, 0, 0 };
DateTime[] motortime = new DateTime[] { DateTime.Now, DateTime.Now, DateTime.Now };
void MotorControl(eMotList mot, eMotControl cmd)
{
if (cmd == eMotControl.Stop)
{
eDOName pin = eDOName.PORTL_MOT_RUN;
if (mot == eMotList.Center) pin = eDOName.PORTC_MOT_RUN;
else if (mot == eMotList.Right) pin = eDOName.PORTR_MOT_RUN;
//출력이켜져있다면 끈다
if (GetDOValue(pin)) SetOutput(pin, false);
}
else if (cmd == eMotControl.Down || cmd == eMotControl.Up)
{
var dir = cmd == eMotControl.Down ? true : false;
eDOName pinDir = eDOName.PORTL_MOT_DIR;
if (mot == eMotList.Center) pinDir = eDOName.PORTC_MOT_DIR;
else if (mot == eMotList.Right) pinDir = eDOName.PORTR_MOT_DIR;
eDOName pinRun = eDOName.PORTL_MOT_RUN;
if (mot == eMotList.Center) pinRun = eDOName.PORTC_MOT_RUN;
else if (mot == eMotList.Right) pinRun = eDOName.PORTR_MOT_RUN;
if (GetDOValue(pinDir) != dir) SetOutput(pinDir, dir);
if (GetDOValue(pinRun) == false) SetOutput(pinRun, true);
}
}
bool SetOutput(eDOName pin, bool value)
{
return dio.SetOutput((int)pin, value);
}
/// <summary>
/// Check the value of internal temporary buffer
/// </summary>
/// <param name="addr"></param>
/// <returns></returns>
byte ReadBuffer(eswPLCAddr addr)
{
return buffer[(int)addr];
}
void WriteBuffer(eswPLCAddr addr, byte value)
{
if (addr >= eswPLCAddr.LCmd) throw new Exception("Command must be written directly to swplc");
buffer[(int)addr] = value;
}
void WriteBuffer()
{
var idx = 0;
//현재상태를 기록합니다
var bReady = dio != null && dio.IsInit;
buffer[idx++] = bReady ? (byte)1 : (byte)2;
//모터상태값3개는 동작시 발생한다
idx++;
idx++;
idx++;
}
/// <summary>
/// Automatically stops when limit sensor and detect are detected.
/// </summary>
void AutoStop()
{
if (dio == null || dio.IsInit == false || autocontrol == false) return;
//모터가 동작중에만 처리한다.
var motrunL = dio.GetDOValue((int)eDOName.PORTL_MOT_RUN);
var motrunC = dio.GetDOValue((int)eDOName.PORTC_MOT_RUN);
var motrunR = dio.GetDOValue((int)eDOName.PORTR_MOT_RUN);
if (motrunL)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTL_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTL_LIM_UP);
var detect = GetDIValue(eDIName.PORTL_DET_UP);
var limDn = GetDIValue(eDIName.PORTL_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTL_MOT_RUN, false);
}
}
}
if (motrunC)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTC_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTC_LIM_UP);
var detect = GetDIValue(eDIName.PORTC_DET_UP);
var limDn = GetDIValue(eDIName.PORTC_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTC_MOT_RUN, false);
}
}
}
if (motrunR)
{
if (GetDIValue(eDIName.BUT_EMGF))
{
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
else
{
var dirDn = dio.GetDOValue((int)eDOName.PORTR_MOT_DIR);
var limUp = GetDIValue(eDIName.PORTR_LIM_UP);
var detect = GetDIValue(eDIName.PORTR_DET_UP);
var limDn = GetDIValue(eDIName.PORTR_LIM_DN);
if (dirDn == false)
{
if (detect)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
else if (limUp)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
else
{
if (limDn)
dio.SetOutput((int)eDOName.PORTR_MOT_RUN, false);
}
}
}
}
private void Sm_Running(object sender, AR.StateMachine.RunningEventArgs e)
{
//throw new NotImplementedException();
var step = (eSMStep)e.Step;
switch (step)
{
case eSMStep.RUN:
break;
}
}
private void Sm_StepChanged(object sender, AR.StateMachine.StepChangeEventArgs e)
{
var step = (eSMStep)e.New;
log.Add($"Step Changed : {step}");
}
DateTime starttime;
bool startminimize = false;
private void timer1_Tick(object sender, EventArgs e)
{
//io상태표시 시작시 최소한한다 230823
if (startminimize == false && this.IsDisposed == false && this.Disposing == false)
{
var ts = DateTime.Now - starttime;
if (ts.TotalSeconds > 3)
{
this.WindowState = FormWindowState.Minimized;
startminimize = true;
}
}
var idx = 0;
if (dio != null && dio.IsInit)
{
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTL_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTL_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTL_MOT_RUN));
ioPanel1.setValue(idx++, GetDIValue(eDIName.BUT_EMGF));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTC_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTC_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTC_MOT_RUN));
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_LIM_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_DET_UP));
ioPanel1.setValue(idx++, GetDIValue(eDIName.PORTR_LIM_DN));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTR_MOT_DIR));
ioPanel1.setValue(idx++, GetDOValue(eDOName.PORTR_MOT_RUN));
ioPanel1.setValue(idx++, false);
}
else
{
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
ioPanel1.setValue(idx++, false);
}
ioPanel1.Invalidate();
//내부버퍼표시
for (int i = 0; i < 16; i++)
{
var addr = (eswPLCAddr)i;
var val = ReadBuffer(addr);
var title = addr.ToString();
if (addr == eswPLCAddr.LCmd || addr == eswPLCAddr.CCmd || addr == eswPLCAddr.RCmd)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(up)";
else if (val == 2) title += "(up)";
else if (val == 3) title += "(stop)";
else if (val == 4) title += "(refresh)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LSts || addr == eswPLCAddr.CSts || addr == eswPLCAddr.RSts)
{
if (val == 0) title += "(--)";
else title += "(~run~)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LMotor || addr == eswPLCAddr.CMotor || addr == eswPLCAddr.RMotor)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(Down)";
else if (val == 2) title += "(up)";
else if (val == 3) title += "(stop)";
gridView1.setTitle(i, title);
}
else if (addr == eswPLCAddr.LPort || addr == eswPLCAddr.CPort || addr == eswPLCAddr.RPort)
{
if (val == 0) title += "(--)";
else if (val == 1) title += "(Limit -)";
else if (val == 2) title += "(Reel Detect)";
else if (val == 3) title += "(Limit +)";
gridView1.setTitle(i, title);
}
gridView1.setValue(i, val);
}
gridView1.Invalidate();
toolStripStatusLabel1.ForeColor = autocontrol ? Color.Green : Color.Black;
toolStripStatusLabel2.Text = swplc.Init ? "Connected" : "Disconnected";
toolStripStatusLabel2.ForeColor = swplc.Init ? Color.Black : Color.Red;
toolStripStatusLabel3.Text = $"Loop({sm.Loop_ms:N0}ms)";
}
bool autocontrol = true;
private void toolStripStatusLabel1_Click(object sender, EventArgs e)
{
this.autocontrol = !this.autocontrol;
}
private void button1_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
swplc.Write((int)eswPLCAddr.LCmd + butno, 4); //refresh port
}
private void button4_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Up);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Up);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Up);
}
private void button9_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Down);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Down);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Down);
}
private void button11_Click(object sender, EventArgs e)
{
}
private void button12_Click(object sender, EventArgs e)
{
var but = sender as Button;
var butno = int.Parse(but.Tag.ToString());
if (butno == 0)
MotorControl(eMotList.Left, eMotControl.Stop);
else if (butno == 1)
MotorControl(eMotList.Center, eMotControl.Stop);
else if (butno == 2)
MotorControl(eMotList.Right, eMotControl.Stop);
}
private void button13_Click(object sender, EventArgs e)
{
var dlg =UTIL.MsgQ("Do you want to exit the program?\nThis is a program that monitors I/O malfunction.It is recommended to run at all times");
if (dlg != DialogResult.Yes) return;
this.exitforce = true;
this.Close();
}
}
}

126
Handler/swPLC/Form1.resx Normal file
View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>104, 17</value>
</metadata>
</root>

26
Handler/swPLC/PUB.cs Normal file
View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.PerformanceData;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project
{
public static class PUB
{
private static CSetting setting;
public static CSetting Setting
{
get
{
if(setting == null)
{
setting = new CSetting();
setting.Load();
}
return setting;
}
}
}
}

88
Handler/swPLC/Program.cs Normal file
View File

@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace Project
{
internal static class Program
{
/// <summary>
/// 해당 애플리케이션의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
if (CheckSingleInstance(false) == false) return;
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
/// <summary>
/// 중복실행 방지 체크
/// </summary>
/// <returns>단일 인스턴스인 경우 true, 중복실행인 경우 false</returns>
static bool CheckSingleInstance(bool prompt = true)
{
string processName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Length > 1)
{
if (prompt == false) return false;
// 중복실행 감지
string message = $"⚠️ {Application.ProductName} 프로그램이 이미 실행 중입니다!\n\n" +
"동시에 여러 개의 프로그램을 실행할 수 없습니다.\n\n" +
"해결방법을 선택하세요:";
var result = MessageBox.Show(message + "\n\n예(Y): 기존 프로그램을 종료하고 새로 시작\n아니오(N): 현재 실행을 취소",
"중복실행 감지",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
// 기존 프로세스들을 종료
try
{
int currentProcessId = Process.GetCurrentProcess().Id;
foreach (Process process in processes)
{
if (process.Id != currentProcessId)
{
process.Kill();
process.WaitForExit(3000); // 3초 대기
}
}
// 잠시 대기 후 계속 진행
Thread.Sleep(1000);
return true;
}
catch (Exception ex)
{
MessageBox.Show($"기존 프로그램 종료 중 오류가 발생했습니다:\n{ex.Message}\n\n" +
"작업관리자에서 수동으로 종료해주세요.",
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
else
{
// 현재 실행을 취소
return false;
}
}
return true; // 단일 인스턴스
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("Sofware PLC")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ATK")]
[assembly: AssemblyProduct("swPLC")]
[assembly: AssemblyCopyright("Copyright © ATK 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("efe600a7-d7b3-4d0a-a6a5-e95032733d11")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("23.07.24.0000")]
[assembly: AssemblyFileVersion("23.07.24.0000")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Properties {
using System;
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Project.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Project.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

1
Handler/swPLC/README.md Normal file
View File

@@ -0,0 +1 @@
# swPLC

3
Handler/swPLC/app.config Normal file
View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>

28
Handler/swPLC/enumData.cs Normal file
View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project
{
public enum eSMStep
{
IDLE,
RUN,
}
public enum eMotList
{
Left=0,
Center,
Right,
}
public enum eMotControl
{
Stop,
Down,
Up,
}
}

View File

@@ -0,0 +1 @@
claude --dangerously-skip-permissions

111
Handler/swPLC/swPLC.csproj Normal file
View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Project</RootNamespace>
<AssemblyName>SoftwarePLC</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\STDLabelAttach%28ATV%29\swPLC\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="arCommUtil">
<HintPath>..\DLL\arCommUtil.dll</HintPath>
</Reference>
<Reference Include="arControl.Net4, Version=18.7.27.1500, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\DLL\arControl.Net4.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CSetting.cs" />
<Compile Include="enumData.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PUB.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sub\arAjinextek\Library\arAjinextek_Union\arAjinextek_Union.csproj">
<Project>{62370293-92aa-4b73-b61f-5c343eeb4ded}</Project>
<Name>arAjinextek_Union</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\CommData\CommData.csproj">
<Project>{14e8c9a5-013e-49ba-b435-efefc77dd623}</Project>
<Name>CommData</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\CommSM\arCommSM.csproj">
<Project>{d54444f7-1d85-4d5d-b1d1-10d040141a91}</Project>
<Name>arCommSM</Name>
</ProjectReference>
<ProjectReference Include="..\Sub\MemoryMapCore\MemoryMapCore.csproj">
<Project>{140af52a-5986-4413-bf02-8ea55a61891b}</Project>
<Name>MemoryMapCore</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

78
Handler/swPLC/swPLC.sln Normal file
View File

@@ -0,0 +1,78 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 15 for Windows Desktop
VisualStudioVersion = 15.0.28307.1000
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "swPLC", "swPLC.csproj", "{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arCommSM", "..\Sub\CommSM\arCommSM.csproj", "{D54444F7-1D85-4D5D-B1D1-10D040141A91}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommData", "..\Sub\CommData\CommData.csproj", "{14E8C9A5-013E-49BA-B435-EFEFC77DD623}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Import", "Import", "{946678A3-F25F-44B8-82E7-2E8437C6B33D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MemoryMapCore", "..\Sub\MemoryMapCore\MemoryMapCore.csproj", "{140AF52A-5986-4413-BF02-8EA55A61891B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arAjinextek_Union", "..\Sub\arAjinextek\Library\arAjinextek_Union\arAjinextek_Union.csproj", "{62370293-92AA-4B73-B61F-5C343EEB4DED}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|x86.ActiveCfg = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Debug|x86.Build.0 = Debug|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|Any CPU.Build.0 = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|x86.ActiveCfg = Release|Any CPU
{EFE600A7-D7B3-4D0A-A6A5-E95032733D79}.Release|x86.Build.0 = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|x86.ActiveCfg = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Debug|x86.Build.0 = Debug|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|Any CPU.Build.0 = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|x86.ActiveCfg = Release|Any CPU
{D54444F7-1D85-4D5D-B1D1-10D040141A91}.Release|x86.Build.0 = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.ActiveCfg = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.Build.0 = Debug|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.Build.0 = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.ActiveCfg = Release|Any CPU
{14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.Build.0 = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|x86.ActiveCfg = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Debug|x86.Build.0 = Debug|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|Any CPU.Build.0 = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|x86.ActiveCfg = Release|Any CPU
{140AF52A-5986-4413-BF02-8EA55A61891B}.Release|x86.Build.0 = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|x86.ActiveCfg = Debug|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Debug|x86.Build.0 = Debug|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|Any CPU.Build.0 = Release|Any CPU
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|x86.ActiveCfg = Release|x86
{62370293-92AA-4B73-B61F-5C343EEB4DED}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D54444F7-1D85-4D5D-B1D1-10D040141A91} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
{140AF52A-5986-4413-BF02-8EA55A61891B} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
{62370293-92AA-4B73-B61F-5C343EEB4DED} = {946678A3-F25F-44B8-82E7-2E8437C6B33D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A1453016-E3CB-4CF9-97A2-94AAAAD23E11}
EndGlobalSection
EndGlobal