'[ 충남인력개발원 ] (2019)'에 해당되는 글 126건

로봇즉 깍기기술 로봇의 외간을 움직이며 깍음

Robot = LMOB #po 이렇게 코드를 부른다

 

로봇이 아닌 깍는 기계를 이용하여 만드는 기계

CNC = Goo #po 이렇게 코드를 부른다

 

 

 

1. 컴파일러 인터프린터 책

 

EMBEDDED RECIPES

 

 

http://recipes.egloos.com/

 

임베디드 레시피

친절한 임베디드 개발자되기 강좌

recipes.egloos.com

DLL (Dynamioc Linking Library)

DLL 만들고 사용하기 

 

 

용접할때는 노이즈가 많이 발생한다 ???

이유는 모르겠지만 그래서 노이즈 방어 선을 많이 쓴다

 

 

nModbus_API_Manual_v1.2_en.pdf
0.77MB

https://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport?view=netframework-4.8

 

SerialPort 클래스 (System.IO.Ports)

 

직렬 포트 리소스를 나타냅니다.Represents a serial port resource.

docs.microsoft.com

두개를 참조하면 공부하기 쉬워진다

 

 

##########

1.일단 추가해야 할 것들이있다

 

여기를 보고 참조하길 바란다

http://comfilewiki.co.kr/ko/doku.php?id=comfilepi:nmodbus4_k:index

 

comfilepi:nmodbus4_k:index [Comfile Technology's Online Documentation]

NModbus4 사용법 산업현장에서 많이 사용하고 있는 MODBUS 프로토콜을 ComfilePi에서 동작시키는 방법을 알아보겠습니다. Nmodbus4 라이브러리를 이용하면 쉽고 간단하게 MODBUS프로토콜을 구현할 수 있습니다. ComfilePi와 PLC 결선 ComfilePi의 RS232 COM0와 PLC의 RS232 포트에 TX-RX, RX-TX, GND-GND로 연결합니다. ComfilePi와 PLC의 RS232 결선은 아래와 같습니다. ※PLC는

comfilewiki.co.kr

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

using Xisom.Scada.Browser;
using Xisom.Scada.Core;
using Xisom.Scada.Model;

using Modbus.Device;
using System.IO.Ports;
using Modbus.Utility;
using System.Windows.Forms.DataVisualization.Charting;

namespace XiSOM_DLL_APP
{
    public partial class Form1 : Form
    {

        byte[] PVTable = new byte[30] { 0,0,0,0,0,0,0,0,0,0,
                                        0,0,0,0,0,0,0,0,0,0,
                                        0,0,0,0,0,0,0,0,0,0};
        byte pvCounter = 0;
        public const byte MAX_PVCOUNT = 30;

        private SerialPort serialPort = null;
        public Form1()
        {
            InitializeComponent();
          
        }
        const int SLAVE_ADDRESS = 1;

        #region 호출 함수루틴
         private void Form1_Load(object sender, EventArgs e)
        {
 
            chart1.Series.Clear();
            Series sPVValue = chart1.Series.Add("PV Value");
            sPVValue.ChartType = SeriesChartType.Line;

             try
            {
                serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);  //온도 조절기 매칭
                serialPort.Open();

                ReadOnceData();
                timer1.Enabled = true;
                timer1.Interval = 1000;
                timer1.Start();

            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        private void ReadOnceData()
        {
            IModbusMaster masterRTU = ModbusSerialMaster.CreateRtu(serialPort);
            const ushort SLAVE_REGISTER = 0;
            const ushort SLAVE_POINT = 7;
            try
            {
                ushort[] result = masterRTU.ReadHoldingRegisters(1, SLAVE_REGISTER, SLAVE_POINT);
                textBox3.Text = string.Empty;
                foreach (ushort item in result)
                {
                    textBox3.Text += string.Format("{0}/", item);
                }
                string[] array = textBox3.Text.Split('/');
                textBox1.Text = array[2].Insert(array[1].Length - 1, ".");   //SV 
                textBox2.Text = array[1].Insert(array[2].Length - 1, ".");   //PV
            }
            catch (Exception ex)
            {
                ReportError(ex.Message);
            }
        }

        void ReportError(string s)
        {
            MessageBox.Show(s);
        }
        private void SendReadholdingRegisterPV()
        {
            IModbusMaster masterRTU = ModbusSerialMaster.CreateRtu(serialPort);
            try
            {
                ushort[] result = masterRTU.ReadHoldingRegisters(1, 1, 1);
                textBox2.Text = string.Format("{0}", result[0]);
                textBox2.Text = textBox2.Text.Insert(textBox2.Text.Length - 1, ".");
                //result값을 저장하고 나서 
                PVTable[pvCounter++] = (byte)(result[0]);  //나누기 10없이 그대로 찍음
            }
            catch (Exception ex)
            {
                ReportError(ex.Message);
            }
        }
        #endregion

        #region 작성된 폼만의 타이머 통신 쓰기명령
        private void button2_Click(object sender, EventArgs e)
        {
            IModbusMaster masterRTU = ModbusSerialMaster.CreateRtu(serialPort);
            try
            {
                ushort[] result = masterRTU.ReadHoldingRegisters(1, 1, 1);
                //bool[] result = _modbusMaster.ReadCoils(SLAVE_ADDRESS, 2, 1);
                //if (result[0] != 0)
                //{
                //    textBox1.Text = "ON";
                //}
                //else
                //{
                //    textBox1.Text = "OFF";
                //}
                textBox2.Text = string.Format("{0}", result[0]);
                textBox2.Text = textBox2.Text.Insert(textBox2.Text.Length - 1, ".");
            }
            catch (Exception ex)
            {
                ReportError(ex.Message);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                IModbusMaster masterRTU = ModbusSerialMaster.CreateRtu(serialPort);
                string t = textBox1.Text;
                int cnt_t = t.Length - t.IndexOf('.') - 1;  //소수점 이하자리 카운트
                float ff = (float.Parse(textBox1.Text)) *  cnt_t;
                
                string[] st= t.Split('.');
                t = st[0] + st[1];
                
                ushort[] data = new ushort[] { Convert.ToUInt16(t)};
              
                masterRTU.WriteMultipleRegisters(1, 301, data);
            }
            catch (Exception ex)
            {
                ReportError(ex.Message);
            }
        }
        #endregion

        #region 작성된 폼만의 타이머 통신
        private void timer1_Tick(object sender, EventArgs e)
        {
            SendReadholdingRegisterPV();
            if (pvCounter >= MAX_PVCOUNT)
            {
                for (int i = 0; i < (MAX_PVCOUNT-1); i++)
                {
                    PVTable[i] = PVTable[i + 1];
                }
                pvCounter--;
            }
            chart1.Series[0].Points.DataBindY(PVTable);
        }
        #endregion
    }
}
블로그 이미지

Or71nH

,

Clnt완성중.c
0.01MB

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

clnt완성중  (0) 2020.02.13
Ubutu 설명페이지 한글 MAN_PAGE KO  (0) 2020.01.15
파일 비교하기 프로그램  (0) 2020.01.14
Fgets Select(FD) 에 관하여  (0) 2020.01.13
Uduntu window 통신  (0) 2020.01.13
블로그 이미지

Or71nH

,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

namespace Project
{
    public partial class Form1 : Form
    {
        //=============================== 전역 변수 선언
        Excel.Application ap = null;
        Excel.Workbook wb = null;
        Excel.Worksheet ws = null;


        string filepoint = "C:\\Users\\Administrator\\Documents\\Point1.xlsx";
        //=============================== 전역 변수 끝


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ap = new Excel.Application();

                wb = ap.Workbooks.Open("C:\\Point1.xlsx");

                ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;

                TB_8Bit.Text = ws.Cells[2, 3].Value.ToString();
                TB_16Bit.Text = ws.Cells[3, 3].Value.ToString();
                TB_32Bit.Text = ws.Cells[4, 3].Value.ToString();
                TB_Float.Text = ws.Cells[5, 3].Value.ToString();
                if (ws.Cells[6, 3].Value == 0)
                    TB_Digital.Text = "OFF";
                else
                    TB_Digital.Text = "ON";
                TB_String.Text = ws.Cells[7, 3].Value.ToStirng();

                ws = wb.Worksheets.get_Item(2) as Excel.Worksheet;
                TB_16Bit_2.Text = ws.Cells[2, 2].Value.ToString();
                TB_String_2.Text = ws.Cells[2, 3].Value.ToString();
                wb.Save();
                wb.Close(false);
                ap.Quit();
            }
            catch (Exception ex)
            {
                throw ex;

            }

        }

    }
}

 

이코드는 불러오는 코드이다 설정을 보고 참고 하길 바란다

 

'[ 충남인력개발원 ] (2019) > ┗C#' 카테고리의 다른 글

8일차 모스키토 사용  (0) 2020.04.16
6일차 C#과 ModBus  (0) 2020.04.13
4일차 Fuction 3 코드 해석  (0) 2020.04.09
3일차 코드 모두버스의 대하여  (0) 2020.04.08
2일차 코드??  (0) 2020.04.07
블로그 이미지

Or71nH

,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys.socket.h>
#include <sys/time.h> // timeval {tv.sec; tv.usec; }를 사용하기 위하여 쓴다
#include <sys/select.h> // FD_ISSET FD_CLR FD_SET FD_ZERO를 사용하기 위하여 쓴다

//모든 크기를 정해놓고 시작하자
#define BUF_SIZE 1024
#define NAME_SIZE 256



//불러올 함수이다
void * void_send_Data(void * Mysocket_input);// 전송용 
void * void_recv_Data(void * Mysocket_input);// 받기용

//전역 변수이다
char MyName[NAME_SIZE] // 이녀석 이름
char UName[NAME_SIZE]  // 보내는 여석 이름
char InputData[BUF_SIZE] // 보낼거 입력한 싸이즈 
char RecvData[BUF_SIZE] // 받을놈 싸이즈 

//메인함수이다
int main(int inputcount, char *inputdata[])
{
	int MySocket; // 나의 소켓
	struct sockaddr_in GoTo_addr; // sockaddr_in 형식의 변수이름 clnt_addr 만듬
	pthread_t snd_thread; // 전송용 쓰레드 생성
	pthread_t rcv_thread; // 받기용 쓰레드 생성
	void * snd_thread_return; // 전송용 쓰레드 리턴 
	void * rcv_thread_return; // 수신용 쓰레드 리
	
	if(inputcount!=4) {  		//접속이 잘됫는지 확인하여 실행여부 판단 
		printf("Usage : %s <IP> <port> <name>\n" , argv[0]);
		exit(1);
	}	
	
	MySocket=socket(PF_INET, SOCKSTREAM, 0); //새로 생성된 내 소켓
		
	memset(&clnt_addr, 0, sizeof(clnt_addr)); // clnt_addr의 방마다 크기에 맞게 초기화
	GoTo_addr.sin_family=AF_INET; // 주소 형식을 인터넷으로 설정함
	GoTo_addr.sin_addr.s_addr=inet_addr(inputdata[1]); // Server IP를 작성하여 보낼곳을 정한다
	GoTo_addr.sin_port=htons(atoi(inputdata[2]));// Server Port를 작성하여 보낼곳을 정한다
	
	if(connect(MySocket, (struct sockaddr*)&GoTo_addr, sizeof(GoTo_addr))==-1) //소켓이 잘만들어 졌나 확인 (inputdata[]배열의 하나가 더 생기고 거기에 소켓이 들어감)
		error_handling("connect() error");


/////////////닉네임 전송 /////////////
	sprintf(MyName, "%s",inputdata[3]); // 받은 이름을 저장함
	write(MySocket, MyName, Name_SIZE); // write는 Null이 안나오면 읽었던 곳까지 읽고 킵해놓는다write(생성된 소켓 정보, 닉네임 데이터, 사이즈를 정해줌 )
////////////전송 끝//////////////////


	print("\n\nCONNECTING...\n[Help] If you want \"Help\" -> /Help\n") //헬프 메뉴얼 설명을 만든다

	pthread_create(&snd_thread, NULL, void_send_Data, (void*)&MySocket); // 전송용 쓰레드를 함수 void_send_Data 에 MySocket의 정보를 넣어 생성한다(실행도한다)
	pthread_create(&rcv_thread, NULL, void_recv_Data, (void*)&MySocket); // 수신용 쓰레드를 함수 void_send_Data 에 MySocket의 정보를 넣어 생성한다(실행도한다)
	
	pthread_join(snd_thread, &snd_thread_return); // 전송 쓰레드가 종료되는것을 기다린다
	pthread_join(rcv_thread, &rcv_thread_return); // 수신 쓰레드가 종료되는것을 기다린다
	
	close(MySocket); // 소켓을 닫는다
	return 0; //실행되면 0값 돌려
}

// send_Data 함수이다 
void * void_send_Data(void * Mysocket_input) // 전송용 쓰줌레드 함
{
	// 필요한 변수들
	int * MySocket = (int*)Mysocket_input; // 쏘켓의 주소를 int형으로 다시 받아온다

	// 필요한 FD들
	int restart; // Select에 사용할 정수 0이면 반복
	fd_set FDinput, NextFDinput;      // 전송받은 파일의 번호수 나 이름을 기역하기 위해서
	struct timeval TimeSleepValue; // 타임슬립 구조체를 가져와 사용하기위해
	char RealSend[NAME_SIZE + BUF_SIZE + 2]; //특정 명령어를 확인하기 위하여 


	while (1) // 계속 실행하기위해서 
	{		
		/////////////// 1초동안 입력없을시 계속 실행  ///////////////
		FD_ZERO(&FDinput); // FD의 값을 0으로 초기화 한다 
		FD_SET(STDIN_FILENO, &FDinput); //SYDIN_FILENO 파일번호를 받아 FDinput에 적어넣는다
		while (1) {
			
			memset(InputData, 0, sizeof(InputData)); //InputData 0으로 초기화
			
			TimeSleepValue.tv_sec = 1;  		//타임 1초 설정
			TimeSleepValue.tv_usec = 0;		//타임 유니세크(초보다작은거) 0 설정
			
			NextFDinput = FDinput			// 다음 FD를STDIN_FILENO 상태로 만들어줌
			restart = select(STDIN_FILENO + 1, &NextFDinput, NULL, NULL, &TimeSleepValue);  // select(파일의 순번을 받는다, 파일의 번호를 받는다?? , 읽기쓰기타입,   , 슬립할 타임설정); 
			//FD를 
					/////////////// 1초동안 입력없을시 계속 실행 .////////
			if (FD_ISSET(STDIN_FILENO, &NextFDinput)) // FD_ISSET(여기는 입력[이거 사용하는사람의 입력]이 있으면 숫자로 반환된다 , 여기는 입력이 없으면 제한시간을 넘으면 FALSE로 반환한다 즉 2조건을 다 확인하는 방식으로 진행이된다
			{
				fgets(InputData, BUF_SIZE, stdin)			//stdin 전송받은 값이 여기있다 아마 컴퓨터 내장에 있는거 같다 그것을 BUF_SIZE 만한 크기에 맞게 짤라서 ecvData에 넣어준다 다 받지 못하면 아마 반복되는거같다
				if (!strncmp(InputData, "quit\n", 5))		//문자를 비교한 다 비교한 것에 quit\n 이 있을 경우 전송을 중단한다 quit\n 가5글자여서 5만 비교한거 같음
				{
					*Mysocket = -1;						//소켓을 삭제하고 메인으로 돌아간다
					return NULL;						//끝났기때문에 반복하지않는다
				}
				else if (InputData[0] != '[')			//(RecvData[0]) 여기가 이제부터 비교문장이다  RecvData[0] 이기때문에 하나만 비교하는 구문이 되어있다 이거 else 로 나중에 수정하고 다 ALLmsg로 바꾸는 식으로 해야겟다
				{
					strcat(RealSend, "[ALLMSG]");						//명렁어 str 에 ALLMSG를 첫번쩨이 추가한다
					strcat(RealSend, InputData);						//입력한 데이터를 진짜 보넬 문자에 합쳐준다 
				}
				else {
					strcpy(RealSend, InputData);				// 입력란에 [ 이있으면 명령어가 있는 것이니 그대로 출력한다 
				}
				
				if (write(*Mysocket, RealSend, strlen(RealSend)) <= 0)	//write 값이 에러이면 
				{
					*Mysocket = -1;                 // 소켓 없에기 
					return NULL;
				}				
			}
			
			if (restart == 0)          // 재시작이 문제가 있으면 
			{
				if (*Mysocket == -1)   //소켓이 에러 가 있으면 
				{
					return NULL;       // 널값 반환
				}
			}
		}
	}
}


void * void_recv_Data(void * Mysocket_input)
{
	int * Mysocket = (int *)Mysocket_input; //입력한 소켓 정보 가져오기
	char * pTocken;							//잠시 나눈거 맏을예
	char * split_Data[];							//받은 메세지

	char get_Data[NAME_SIZE + BUF_SIZE + 1];
	int get_Data_length
	while (1) 
	{
		memset(get_Data, 0x0, sizeof(get_Data));
		get_Data_length = read(*Mysocket, get_Data, NAME_SIZE + BUF_SIZE);

		if (get_Data_length <= 0)
		{
			*Mysocket = -1;
			return NULL;
		}
		get_Data[get_Data_length] = 0;
		fputs(get_Data, stdout);

		pToken = strtock(name_msg, "[@]");
		i = 0;
		while (pTocken != NULL)
		{
			pArray[i] = pToken;
			if (i++ >= MAX_SPLIT)
				break;
			pTocken = strtok(NULL, "[@]");
		}

		for (int i = 0 ; i < split_Data.length())

	}
}

void error_handling(char * msg)
{
	fputs(msg, stderr);
	fputc('\n', stderr);
	exit(1);
}

























iot_server.c
0.01MB
iot_client.c
0.00MB
file_server.c
0.00MB
file_client.c
0.00MB

 

 

Clnt.c
0.01MB
Server.c
0.00MB

 

 

Clnt완성중.c
0.01MB

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

통신 TCP 코드 자료  (0) 2020.04.07
Ubutu 설명페이지 한글 MAN_PAGE KO  (0) 2020.01.15
파일 비교하기 프로그램  (0) 2020.01.14
Fgets Select(FD) 에 관하여  (0) 2020.01.13
Uduntu window 통신  (0) 2020.01.13
블로그 이미지

Or71nH

,

윈도우 7 은 무선 인터넷 부터 확인해야한다

이 익숙한ㅇ 꽃개 모양 애 열어주고 없으면 설치할것 

저기에 액세스 들어간다

그리고

아두이노 SSID 를 적어서 주소를 맞쳐주고 네트워크는 WPA2=PSK로 하자 왠지 모름

 

비밀번호 처서 연결해준다

그럼 본인의 피씨가 핫스팟이 되어 외부 네트워크랑 공유가 가능하게 만들어준다

이런 코드표가 있다 

참고를 하여 주소의 값을 가져와야 하는데 

저기 트릭이라고 저거 불러오면 된다 

핀번호는 아두이노 할때 설정값인 걸로 알고 있다

 

 

설정값은 이렇게 장치 추가 해주고

이런식으로 추가를 해준다 

그러면 불러오기가 가능해진다

통신을 만들어줄 서버와 확인할거 CMD 틀어주고

써버임 위에거

 

이건 확인차 열어놓은거

 

 

이거할려면 mosquitto 따운 해야함 

.

https://story-of-flower.tistory.com/233

 

모스키토 통신 사용하기 windows X-SCADA

https://deneb21.tistory.com/416 MQTT 개념과 Mosquitto 설치 및 사용 이번에는 사물인터넷에서 각광 받고 있는 메시지 전송 프로토콜인 MQTT (Message Queue Telemetry Transport) 에 대해서 알아보겠습니다. M..

story-of-flower.tistory.com

 

여기에서 확인하여 다운하면됨

 

실행하면 끝

블로그 이미지

Or71nH

,