반응형

안녕하세요

 

코딩하는남자의 코딩연습생입니다

 

이번 블러그에서는 C#에서 MX Component V4의 API를 이용하여 PLC와 통신할 수 있는

 

설정 방법을 다뤄보겠습니다

 

 

1. MX Conmpnent의 Communication Setup Utility를 이용해서 기본 셋팅 한다

    필자가 작성한 게시글중 MX Componnent v4 설정 방법의 게시글을 참고

 

 

2. GX Works2를 실행 및 새 프로젝트 생성해서 간단한 Ladder 코드를 작성하고 GX Simulator를 실행한다

    Ladder코드는 검색을 통해 작성하시기 바란다.

 

 

3. 비쥬얼스튜디오 2017를 실행해서 프조게트를 생성한다

   C#이든 WPF든 생성한다

   

 

 

4, 비쥬얼 스튜디오에 MX Component의 설치 경로에 있는 DLL 파일을 참조 추가 한다

ActEther.dll 은 이더넷 카드를 통해서 LAN선으로 연결하고자 할 사용 가능하다. 다만 설정할 것들이 좀 있다

ActPcUsb.dll은 CPU의 USB Port를 통해서 PLC에 접근하고자 할 때 사용할 수 있다

ActUtlType.dll은 Step1에서 설정한 내용을 기준으로 PLC에 접근이 가능하도록 해준다

 

 

 

5. 비쥬얼 스튜디오 디자인을 다음과 같이 간단하게 한다

 

6. 비쥬얼 스튜디오에서 소스를 입력한다

 

 

소스코드까지 입력하고 난뒤에 프로젝트를 실행한뒤 Logical station number 부분에 MX Component V4에서 설정한

 

station number를 입력한뒤 connect 버튼을 클릭하게 되면 우측 상단의 Connected : 부분에 현재의 PLC의 상태 값이

 

표시된다

 

정상적으로 표시가 된다면 연결에 성공하신것이다

반응형
반응형

안녕하세요

 

코딩하는남자의 코딩 연습생입니다

 

미쯔비시 PLC와 통신하기 위한 MX Componnent v4 설정방법에 대한 글을 게시햇었는데

 

GX Works2 시뮬레이션 환경 설정 방법에 대한 글이 없어 작성하게 되엇습니다

 

해당 글은 실제 미쯔비시 PLC가 없더라도 GX Works2의 시뮬레이션 환경을 통해

 

PLC의 환경을 구성해 줍니다

 

설정 방법은 아래를 참고해 주세요~

 

 

1. GX WORKS2를 설치 한다

   다운 받아서 다음 버튼을 통해 설치하면 되므로 설명은 생략

 

 

2. GX WORKS2를 실행하고 New Project를 실행해서 기본 정보를 입력해서 OK 버튼을 누른다

간단한 Ladder 코드를 자것ㅇ하고 M0가 접점이 이고, D0가 랜덤하고 값을 입력하는 코드

 

 

3. Ladder를 작성 한뒤 Debus > Start/Stop Simulation 클릭

4. 시뮬레이션 가동 상태

    처음 실행시 ERR 발생시 RESET 후 RUN 해야 함

 

 

5. 시뮬레이션 정상 가동인 상태

 

 

 

반응형
반응형

 

using System;
using System.Data;
using System.Data.OleDb;
class TableAnalysis
{
     static void Main(string[] args)
     {

        string sql = "Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=noaa;Persist Security

                        Info=True"; //oracle 서버 연결

        OleDbConnection conn = new OleDbConnection(sql);
        //conn.ConnectionString = sql;

        try
        {
             conn.Open(); //데이터베이스 연결
             OleDbCommand cmd = new OleDbCommand();
             cmd.CommandText = "select * from member"; //member 테이블
             cmd.CommandType = CommandType.Text; //검색명령을 쿼리 형태로
             cmd.Connection = conn;

             OleDbDataReader read = cmd.ExecuteReader(); //select * from member 결과

             Console.WriteLine("***** 테이블 분석 결과 *****");

            

             for (int i = 0; i < read.FieldCount; i++)
             {
                  Console.WriteLine("필드이름 : {0} \n", read.GetName(i));
              }
              Console.WriteLine("총필드 개수는" + read.FieldCount);
              read.Close();
           }

          catch (Exception ex)
           {
               Console.WriteLine("에러발생{0}", ex.Message);
           }
           finally
           {
                if (conn != null)
                {
                      conn.Close(); //데이터베이스 연결 해제
                      Console.WriteLine("데이터베이스 연결 해제..");
                 }
           }
      }
}
반응형
반응형
///<summary>
/// 데이타 테이블을 엑셀로 받아온다.
///</summary>

/// <param name="dt">원본 데이타 테이블.</param>
/// <param name="columns"> 원본 데이타 테이블의 컬럼들.</param>
/// <param name="newcolumns">보여질 테이블의 컬럼들.</param>


private static void DownExcel(System.Data.DataTable dt, string[] columns, string[] newcolumns)
{
      DataGrid grid = new DataGrid();
      System.Data.DataTable targetdt = new System.Data.DataTable();

      for (int i = 0; i < columns.Length; i++)
      {
          System.Data.DataColumn column = new System.Data.DataColumn(newcolumns[i]);
          targetdt.Columns.Add(column);
       }


       for (int i = 0; i < dt.Rows.Count; i++)
       {
           object[] obj = new object[columns.Count()];

           for (int j = 0; j < columns.Length; j++)
                 obj[j] = dt.Rows[i][columns[j]];
                 targetdt.Rows.Add(obj);
       }

       grid.DataSource = targetdt;
       grid.DataBind();

       System.Web.HttpResponse objResponse = System.Web.HttpContext.Current.Response;
       objResponse.ClearContent();
       objResponse.ClearHeaders();
       System.IO.StringWriter stringWrite = new System.IO.StringWriter();
       HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
       grid.RenderControl(htmlWrite);

       objResponse.ContentType = "application/vnd.msexcel";
       objResponse.AddHeader("content", "text/html; charset=utf-8");
       objResponse.AddHeader("content-disposition", "attachment; filename=SearchResults.xls");
       objResponse.Write("");
       objResponse.Write(stringWrite.ToString());
       objResponse.Flush();
       objResponse.Close();
       objResponse.End();
}

 

// 사용법

void btn_ok_Click(object sender, EventArgs e)
{
     string[] columns = { "title", "filename", "view_count", "blogurl" }; // 기존의 컬럼명
     string[] newcolumns = { "제목", "파일명", "조회수", "블로그주소"}; // 새로운 컬럼명
     System.Data.DataTable dt = ds.Tables[1]; // 데이타 테이블
     DownExcel(dt, columns, newcolumns);
}

 

 

반응형
반응형

안녕하세요.

 

코딩하는남자 입니다

 

이번 블로그 내용은 C#을 통해 차트를 작성할경우 보통 상용 API를 통해 구현하게 되는데요

 

 

 

저희 같은 서민들은 그걸 구입할 돈이 없지요ㅋ

 

그래서 열심히 인터넷 검색을 통해서 무료로 사용할 수 있는 차트가 있어서 소개해 드릴려고 합니다

 

마도 MS Chart 인데요.

 

비쥬얼스튜디오에서 개발하는 C#에서 사용하기 참 좋은 API라고 생각합니다

 

혹시 자체 개발을 통해 어떠한 통계나 수치를 표현하고 싶으시면 한번 시도해 보시면 좋을거 같습니다

 

C#으로 구현하기 위해 간단한 예제를 같이 올려 드리니 분석 해서 나만의 차트를 구현해 보시기 바랍니다

 

[Souce Code]

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Diagnostics;



namespace MSChart_Controls_Test{
     public partial class Form1 : Form
     {
         Chart chart = null;

        public Form1()
        {
            InitializeComponent();

            ChartDataInput();
         }



        private void ChartDataInput()
        {
            //x,y축에 사용될 값을 먼저 준비 한다
            //x축 값
            string[] xValues1 = { "Korea", "Frence", "Canada", "Germany", "Italy" };

            //y축 값
            double[] yValues1 = { 67.66, 89.57, 82.44, 85.24, 87.93 };
            double[] yValues2 = { 77.66, 89.57, 92.44, 95.24, 97.93 };

            //차트를 변수에 담아주고
            chart = this.chart1;

            //계열을 초기화 처음에 Series1이 기본으로 들어가기 때문에 삭제해 준다
            chart.Series.Clear();

            //계열을 새로 생성해서
            Series s1 = new Series("international");
            Series s2 = new Series("International2");

            //계열을 추가해 준다
           chart.Series.Add(s1);
           chart.Series.Add(s2);

          //추가된 계열에 값을 넣어준다
          //x축 값은 하나만 있으면 되기 때문에 처음부터 데이터를 하나만 준비한다
          //만약 s2애 x축값도 만들어서 DataBindXY로 값을 넣어도 x축은 변경되지 않는다

          //한번설정하면 Y축은 값이 변경되어도 X축은 값이 변경되지 않는다
          s1.Points.DataBindXY(xValues1, yValues1);
          s2.Points.DataBindY(yValues2);

          //차트타입을 막대로 한다
          s1.ChartType = SeriesChartType.Column;

         //범례를 보여준다 
         chart.Legends[0].Enabled = true;

         //테두리선굵기 (선종류로 해야 차이가 나타난다)
         s1.BorderWidth = 12;

        //색 변경
        s1.Color = Color.OrangeRed;

        //계열에 값표시
        s1.IsValueShownAsLabel = true;

        //계열에 그라데이션을 준다
        s1.BackGradientStyle = GradientStyle.VerticalCenter;
        s2.BackGradientStyle = GradientStyle.Center;

       //아래 두줄을 풀변 상하 이중축이되고
       //s1.XAxisType = AxisType.Primary; //기본축
       //s2.XAxisType = AxisType.Secondary; //보조축

      //아래 두줄을 풀면 좌우 이중축이된다
      //s1.YAxisType = AxisType.Primary;
     //s2.YAxisType = AxisType.Secondary;

     //차트의 테두리선을 붉은색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.BorderlineColor = Color.Red;
     chart.BorderlineDashStyle = ChartDashStyle.Solid;
     chart.BorderlineWidth = 1;

     //차트의 내부 테두리 선을 파란색의 연결된 선으로 그리는데 선의 넓이는 1이다
     chart.ChartAreas[0].BorderColor = Color.Blue;
     chart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;
     chart.ChartAreas[0].BorderWidth = 1;

     //차트의 내부 테두리 선을 변경
     chart.ChartAreas[0].AxisX.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.LineColor = Color.Blue;
     //chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
     //chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;

     //차트의 배경 격자선을 변경
     chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Blue;
     chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;

     //차트의 외부로 삐져나온 선을 변경
     chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = Color.Red;
     chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
     chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false;

      //첫번재 계열의 네번째 그래프만 파란색으로 변경
     s1.Points[4].Color = Color.Blue;
   }

private void ChartDataInput2()
    {
       //차트를 변수에 담아놓고
       chart = this.chart1;

       //계열도 변수에 담는다
       Series series1 = new Series("Test");
       Series series2 = new Series("Test2");

       //xValue를 준비
       string[] xValue = { "국어","영어","수학" };

       //계열을 초기화
       chart.Series.Clear();

       //계열을 추가
       chart.Series.Add(series1);
       chart.Series.Add(series2);

       //계열을 변수에 담지 않고 이렇게 바로 추가해도 된다

      //그러나 계열을 이렇게 선언하면 아래처럼 series1변수로 접근하지 못하고 chart.series[0] 또는

      //chart.series["Test"] 이렇게 접근해야 한다
       //chart.Series.Add("Test");
      //chart.Series.Add("Test2");

      //테두리선굵기 (선종류로 해야 차이가 나타난다)
      series1.BorderWidth = 12;

      //색 변경
      series1.Color = Color.OrangeRed;

      //차트 모양을 막대로 지정
      series1.ChartType = SeriesChartType.Column;
      series2.ChartType = SeriesChartType.Column;

      //테스트 계열에 값을 세개 추가
      series1.Points.AddY(21.7);
      series1.Points.AddY(20);
      series1.Points.AddY(18.5);

      //테스트2 계열에 값을 세개 추가
      series2.Points.AddY(22.4);
      series2.Points.AddY(19.2);
      series2.Points.AddY(23.8);
    }

     private void button1_Click(object sender, EventArgs e)
     {

        //차트를 변수에 담아놓고
       chart = this.chart1;

       //차트 모양을 꺽은선으로 변경
       if (chart.Series[0].ChartType == SeriesChartType.Column)
       {
           chart.Series[0].ChartType = SeriesChartType.FastLine;
           chart.Series[1].ChartType = SeriesChartType.FastLine;
        }
        else
        {
          chart.Series[0].ChartType = SeriesChartType.Column;
          chart.Series[1].ChartType = SeriesChartType.Column;
         }
     }

     private void button2_Click(object sender, EventArgs e)
     {
       //차트를 변수에 담아놓고
       chart = this.chart1;

        //원통형으로 변경
       chart.Series[1].CustomProperties = "DrawingStyle=Cylinder";

       //3D
       chart.ChartAreas[0].Area3DStyle.Enable3D = !(chart.ChartAreas[0].Area3DStyle.Enable3D);
     }

     private void button3_Click(object sender, EventArgs e)
     {
        //범례를 보여줬다가 안보여줬다가 한다
        this.chart1.Legends[0].Enabled = !(this.chart1.Legends[0].Enabled);
      }

      private void button4_Click(object sender, EventArgs e)
      {
        //첫번째 계열을 순환 하면서 가장 큰 계열의 색을 검은색으로 변경한다
        int point = 0;
        int yvalue = 0;

        for (int i = 0; i < this.chart1.Series[0].Points.Count; i++)
        {
            Debug.Print(this.chart1.Series[0].Points[i].YValues[0].ToString());
            if (yvalue < (int)this.chart1.Series[0].Points[i].YValues[0])
            {
                point = i;
                yvalue = (int)this.chart1.Series[0].Points[i].YValues[0];
             }
          }

        this.chart1.Series[0].Points[point].Color = Color.Black;
      }
    }
}

 

 

붙여넣기를 햇더니 코드가 많이 엉망이 됐네요ㅎㅎ

 

나중에 시간내서 정리하도록 하겠습니다~

 

그럼 코딩하는남자 였습니다~!

 

 

반응형
반응형

안녕하세요~

C# 프로그래밍을 연습 개발 하고 있는 코딩하는남자 입니다!!

 

이번에 연습해볼것은 QR코드 생성 인데요

왜 굳이 C#으로 QR코드를 생성해요? 라는 의구심이 드실거 같은데요

QR코드를 사용하여 활용할 곳이 생각보다 많다(?) 입니다ㅋㅋㅋ

굳이 예를 들면 인식이 필요한 프로그램 개발시

또는 자재관리, 재고관리, 재공관리, 물류관리, 편의점, 등

모든 물건을 다루는 곳에서 갯수, 금액 등을 관리하기 위한 인식코드로

많이 사용 할수 있을거 같네요

아 본문으로 돌아와서 C#에서 어떻게 문자열을 QR코드로 생성을 시키는지

보도록 하겠습니다

참고로 저도 인터넷 정보를 보고 연습을 하고 실전에 적용을 하는 입장이다 보니 검색을 통해 저보다 더 상세한 정보를 검색해 보실수 있으니 중복 검색은 필수 입니다

============================================

개발환경 : Visual Studio 2010 사용

QR코드 Generator DLL : 링크 참조

QR Code .NET Generator | Using free .NET sample to create QR Code barcodes

BizCode Generator for .NET Ultimate The most mature & flexible barcode SDK for Microsoft .NET Framework Quick Overviews Mature barcode creating SDK Support every .NET IDEs Support C#, VB.NET, etc. Dynamic barcodes support For all printers Overview QR Code More Barcode Tutorial C# Sample VB.NET S

www.businessrefinery.com

===============================================

준비가 되셨다면 차근 차근 이미지로 하나씩 따라 해볼까요?

 

1. QR코드 Generator DLL 다운로드 받기

: 링크를 통해 싸이트 접속 후 DOWNLOAD 버튼 클릭

어렵지 않아요

 

2. 비쥬얼 스튜디오에 참조 시키기

1) 다운로드 받은 파일 압축 풀기

※ 압축을 풀었을때 사진 입니다 처음에는 압축형식으로 되어 있어요~

 

 

2) 참조 DLL 찾기

압축을 풀면 다음과 같은 구조로 압축이 풀리게 되는데

저희가 사용할 DLL의 위치를 알려드릴께요~

천천히 그림파일을 참고해서 따라오세요~

 

 

3) 비쥬얼 스튜디오 DLL 참조 시키기

기본적인 비쥬얼 스튜디오에 DLL참조하는 방법은

아마 다들 아실꺼라고 생각하고 대충 넘어가겠습니다

절대 귀찮아서가 아닙니다!!

비쥬얼 스튜디오에 DLL을 첨부 완료되고 난 뒤에 화면 입니다

자 이제 거의 끝나가요~ 별거 없죠?ㅋ

이제 소스 코드로 넘어갈건데요

간단합니다 7줄이면 끝이에요~

참 쉬죠잉~ㅋㅋㅋ

 

 

4) 소스 작성하기

참조시킨 DLL 사용을 위해 참조선언을 먼저 작성해 주세요

사용하실려는 페이지의 제일 상단에 아래와 같이 using문을 작성해주시고요~

 

그다음 아래와 같이 QR코드를 생성할 소스 코드를 입력합니다

참고로 저는 이미지로 보이지 않고 Bitmap으로 전환하여 레포트 툴과 연동 시킬 예정입니다

만약 이미지로 만드실 경우 맨 아래 쪽 구문의 주석을 바꿔주시면 됩니다

QRCode barcode = new QRCode(); string url = pFIELD[22, 3]; barcode.Code = url; barcode.ModuleSize = 6.0f; barcode.Resolution = 300; //이미지로 저장 //barcode.drawBarcode2ImageFile("Temp.png"); //Bitmap으로 전환하여 사용 var barcodebitmap = (Bitmap)barcode.drawBarcodeOnBitmap();

이미지로 표시 할 경우는 위의 구문으로 처리가 완료가 되고 이벤트를 주셔서 사용하시면 Debug폴더 안에 이미지로 생성이 됩니다

 

참고로 저는 레포트툴과 연동을 하기 위해 하나의 구문이 더 필요한데

아래의 구문은 어떤 레포트툴을 사용하시는냐에 따라 달라지기 때문에 참고만 하시기 바랍니다

ARViewer21.Document.Pages[ThisPage].DrawImage(barcodebitmap, false, LSHIFT + ExTTI(1400), PTM + ExTTI(7430), ExTTI(500), ExTTI(420));

네 이상으로 C#을 이용해 QR코드 생성하는 예제였습니다!

글로 이해 안되실분들을 위해서 영상 제작을 해보았습니다

글과 영상을 통해 QR코드를 만들어 나만의 프로그램을 제작해보시는건 어떨까요?ㅎㅎ

이상 코딩하는남자 였습니다!!

반응형

+ Recent posts