..
This commit is contained in:
Submodule Handler/swPLC deleted from 0e85ca8c24
63
Handler/swPLC/.gitattributes
vendored
Normal file
63
Handler/swPLC/.gitattributes
vendored
Normal 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
8
Handler/swPLC/.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
*.suo
|
||||
*.user
|
||||
*.pdb
|
||||
bin
|
||||
obj
|
||||
desktop.ini
|
||||
.vs
|
||||
packages
|
||||
34
Handler/swPLC/CSetting.cs
Normal file
34
Handler/swPLC/CSetting.cs
Normal 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
402
Handler/swPLC/Form1.Designer.cs
generated
Normal 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
762
Handler/swPLC/Form1.cs
Normal 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
126
Handler/swPLC/Form1.resx
Normal 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
26
Handler/swPLC/PUB.cs
Normal 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
88
Handler/swPLC/Program.cs
Normal 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; // 단일 인스턴스
|
||||
}
|
||||
}
|
||||
}
|
||||
36
Handler/swPLC/Properties/AssemblyInfo.cs
Normal file
36
Handler/swPLC/Properties/AssemblyInfo.cs
Normal 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")]
|
||||
63
Handler/swPLC/Properties/Resources.Designer.cs
generated
Normal file
63
Handler/swPLC/Properties/Resources.Designer.cs
generated
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
117
Handler/swPLC/Properties/Resources.resx
Normal file
117
Handler/swPLC/Properties/Resources.resx
Normal 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>
|
||||
26
Handler/swPLC/Properties/Settings.Designer.cs
generated
Normal file
26
Handler/swPLC/Properties/Settings.Designer.cs
generated
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
7
Handler/swPLC/Properties/Settings.settings
Normal file
7
Handler/swPLC/Properties/Settings.settings
Normal 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
1
Handler/swPLC/README.md
Normal file
@@ -0,0 +1 @@
|
||||
# swPLC
|
||||
3
Handler/swPLC/app.config
Normal file
3
Handler/swPLC/app.config
Normal 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
28
Handler/swPLC/enumData.cs
Normal 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,
|
||||
|
||||
}
|
||||
}
|
||||
1
Handler/swPLC/run_claude.bat
Normal file
1
Handler/swPLC/run_claude.bat
Normal file
@@ -0,0 +1 @@
|
||||
claude --dangerously-skip-permissions
|
||||
111
Handler/swPLC/swPLC.csproj
Normal file
111
Handler/swPLC/swPLC.csproj
Normal 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
78
Handler/swPLC/swPLC.sln
Normal 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
|
||||
Reference in New Issue
Block a user