0. 커서 AI - Cursor AI에는 무료 버전인 "Hobby"와 유료 구독 모델이 있습니다. 무료 버전은 2주간의 Pro 체험, 2,000번의 코드 완성 요청, 50번의 프리미엄 요청을 포함
라이브서버/ https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer
- 공유 192.168..0.85
윈도우11 네트워크 공유폴더 설정 및 연결 방법 : 네이버 블로그
https://ko.ipshu.com/ipv4/192.168.0.85#google_vignette
https://www.ipaddress.my/192.168.0.85?lang=ko
- file:///C:/Users/3/Desktop/4.16-%20cjk/%ED%99%88/index.html
0. tistory.com
1. https://www.cursor.com/loginDeepPage
2. 비주얼 스튜디오- https://visualstudio.microsoft.com/ko/downloads/
Visual Studio에서 GitHub Copilot 설치
연경 버튼을 누르면 연결이 확립되고 종료 버튼을 누르면 종료 시켜 줘.ip는 192.168.0.82
포트는 30000 이야
공유폴더 -> 시작-> 검색란에
\\172.18.6.184
데이터 쓰기 ------ X0 켜기
500000FFFF03000D000000011401000000009C010010
----------------- X0 끄기
500000FFFF03000D000000011401000000009C010000
------------------ D0읽기
500000FFFF03000C00000001040000000000A80100
-------------------D0 읽기 응답
D00000FFFF030004000000BB06 (06 BB로 10진수 1723)
--------------------여러 데이터 읽기
500000FFFF03000C000000010400000000009C0500 (X0부터 5개)
--------------------여러 데이터 읽기 응답
D00000FFFF03000C00000015000000000000000000 (15해석 =0001 0101 : X0,X2,X4 ON)
--------------------워드쓰기
500000FFFF03000E00000001140000000000A8010010 (D0에 1값 쓰기)
m0켜기
500000ffff03000d0000000114010000000090010010
m0끄기
500000ffff03000d0000000114010000000090010000
m1켜기
500000ffff03000d0000000114010001000090010010
m1끄기
500000ffff03000d0000000114010001000090010000
읽기
500000ffff03000c00000001040000
텍스트박스
0100
상태읽기
500000ffff03000c00000001040000000000900200
3E프레임 연습 === 응답이 없어
읽기
50 00 00 FF 03 FF 00 00 1C 00 10 04 01 00 00 00 01 06 00 01
500000FF03FF00001C0010040100000001060001
쓰기
500000FF03FF000020000A14010000D*000100000212345678
500000FF03FF000020000A14010000D*000100000212345678
응답한다... 비트
500000FF03FF000d00000001140100M*010000010010
응답한다... 워드
500000FF03FF000C00000001040000D*0000000100
여기까지포멧 ㅣ 여기부터 같다.. 주소만 000000A8 이냐 D*000000 냐 차이
# M0 켜기, M0 끄기 버튼을 만들어 줘
# M0 켜기의 프로토콜은 ,
M0 끄기의 프로토콜은
# 멜섹 PLCDHK 통신하려고 해. 통신ON을 누르면 통신이 연결돼,
통신OFF을 누르면 통신이 연결돼
IP는 192.168.0.82 야.
핵심 개념:
멀섹 PLC와 C# 윈도우 폼 간의 통신은 일반적으로 소켓 통신을 사용합니다. C# 윈도우 폼 애플리케이션이 클라이언트 역할을 하고, PLC가 서버 역할을 하도록 구성할 수 있습니다.
구현 단계:
-
C# 윈도우 폼 프로젝트 생성:
- Visual Studio를 실행하고 새로운 C# 윈도우 폼 앱(.NET Framework) 프로젝트를 생성합니다.
- 폼 디자이너에서 다음과 같은 컨트롤을 추가합니다.
- Button 컨트롤 (이름:
btnConnect
, 텍스트: "연결") - Button 컨트롤 (이름:
btnClose
, 텍스트: "종료") - TextBox 컨트롤 (이름:
txtIP
, 텍스트 초기 값: "192.168.0.82") - TextBox 컨트롤 (이름:
txtPort
, 텍스트 초기 값: "30000") - TextBox 또는 ListBox 컨트롤 (통신 상태 또는 수신 데이터 표시용)
- Button 컨트롤 (이름:
-
네임스페이스 추가:
- 코드 편집기 상단에 다음 네임스페이스를 추가합니다.
C#
using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; // 비동기 작업 지원
- 코드 편집기 상단에 다음 네임스페이스를 추가합니다.
-
클라이언트 소켓 객체 선언:
- 폼 클래스 내에
TcpClient
객체를 선언합니다.C#private TcpClient client; private NetworkStream stream;
- 폼 클래스 내에
-
"연결" 버튼 클릭 이벤트 처리:
btnConnect
버튼을 더블 클릭하여 클릭 이벤트 처리기를 생성하고 다음 코드를 작성합니다.C#private async void btnConnect_Click(object sender, EventArgs e) { string ipAddress = txtIP.Text; int port = int.Parse(txtPort.Text); try { client = new TcpClient(); // 비동기적으로 연결 시도 await client.ConnectAsync(ipAddress, port); if (client.Connected) { stream = client.GetStream(); // 연결 성공 시 UI 업데이트 (예: 상태 표시) MessageBox.Show("PLC 연결 성공!"); // 필요하다면 데이터 수신 대기 스레드 또는 Task 시작 // StartReceivingData(); } else { MessageBox.Show("PLC 연결 실패."); } } catch (SocketException ex) { MessageBox.Show($"소켓 오류: {ex.Message}"); } catch (FormatException) { MessageBox.Show("포트 번호가 올바른 형식이 아닙니다."); } }
-
"종료" 버튼 클릭 이벤트 처리:
btnClose
버튼을 더블 클릭하여 클릭 이벤트 처리기를 생성하고 다음 코드를 작성합니다.C#private void btnClose_Click(object sender, EventArgs e) { if (client != null && client.Connected) { stream?.Close(); // 스트림 닫기 client.Close(); // 소켓 닫기 MessageBox.Show("PLC 연결 종료."); } else { MessageBox.Show("연결된 PLC가 없습니다."); } }
추가 고려 사항:
- 데이터 송수신: 연결이 성공하면
NetworkStream
객체를 사용하여 데이터를 PLC로 보내거나 PLC로부터 데이터를 받을 수 있습니다. 이를 위해 별도의 메서드나 스레드를 구현해야 합니다. - 비동기 작업: UI 스레드가 멈추지 않도록 연결 및 데이터 송수신 작업을
async
및await
키워드를 사용하여 비동기적으로 처리하는 것이 좋습니다. - 오류 처리: 네트워크 연결 및 통신 과정에서 발생할 수 있는 예외(
SocketException
등)를 적절하게 처리하여 애플리케이션의 안정성을 높여야 합니다. - PLC 통신 프로토콜: 멀섹 PLC가 사용하는 특정 통신 프로토콜을 이해하고 해당 프로토콜에 맞춰 데이터를 송수신해야 합니다. (예: Modbus, Ethernet/IP 등). 프로토콜에 따라 데이터 인코딩 및 디코딩 방식이 달라질 수 있습니다.
- UI 업데이트: 백그라운드 스레드에서 데이터를 수신하여 UI 컨트롤을 업데이트할 때는
Invoke
또는BeginInvoke
메서드를 사용하여 스레드 간 충돌을 방지해야 합니다. - 재연결 로직: 필요하다면 연결이 끊어졌을 때 자동으로 재연결을 시도하는 로직을 추가할 수 있습니다.
예시 (데이터 수신 대기 및 표시):
다음은 간단한 데이터 수신 대기 및 텍스트 박스에 표시하는 예시입니다. btnConnect_Click
이벤트 처리기 내에 StartReceivingData()
호출을 추가하고, 다음과 같은 메서드를 구현합니다.
private async void StartReceivingData()
{
byte[] buffer = new byte[1024];
int bytesRead;
try
{
while (client.Connected)
{
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
// UI 스레드에서 텍스트 박스 업데이트
Invoke(new Action(() =>
{
// 통신 상태 또는 수신 데이터 표시용 TextBox (예: txtReceive)
// txtReceive.AppendText($"수신: {receivedData}\r\n");
}));
}
else
{
// 연결이 끊어진 경우 처리
Invoke(new Action(() =>
{
MessageBox.Show("PLC 연결이 끊어졌습니다.");
btnClose_Click(null, EventArgs.Empty); // 연결 종료 처리
}));
break;
}
}
}
catch (IOException ex)
{
Invoke(new Action(() =>
{
MessageBox.Show($"수신 오류: {ex.Message}");
btnClose_Click(null, EventArgs.Empty); // 연결 종료 처리
}));
}
}
주의: 위 코드는 기본적인 연결 및 종료 기능만 제공하며, 실제 데이터 송수신 및 PLC와의 통신 프로토콜 처리는 별도로 구현해야 합니다. 멀섹 PLC의 통신 프로토콜 문서를 참고하여 데이터 송수신 로직을 개발하시기 바랍니다.
궁금한 점이 있다면 언제든지 다시 질문해주세요.
댓글 없음:
댓글 쓰기