본문 바로가기

전체 글

MQTT를 너무 믿은 점.. (오류 편) 최근 로드셀에서 올라오는 데이터를 수집하고 가공하면서 드는 생각을 정리 해야겠다 싶어 적는다.,  보통 중량계에서 RS 통신이나 이더넷 통신으로 데이터를 수집할 때 보통 300ms에서 길어봤자 500ms 정도 이다. 그리고 로드셀의 상태 값과 중량을 ASCII로 표현하여 송신한다.(간혹 hex로 들어오는 경우도...) =>     다시 MQTT로 돌아와서 애초에 MQTT의 특징이 IoT의 특화된 메시징 프로토콜이라 큰 용량의 메시지 보단 작은 용량의 메시지를 기준으로 작업을 한다. 이번 프로젝트도 그걸 간과해서 일어난 일 이겠지...  총 26 군데에서 들어오는 중량의 값을 실시간으로 '한'개의 브로커에서 받을 생각을 하니....  뭐든 테스트는 정말 극악의 환경에서 진행해야한다서버 PC의 램을 96기가.. 더보기
오늘의 실수 - stirng 편 1 (string 길이의 한계값) 지난 포스트에 이어서 계속 프로젝트를 진행하던 중...  프로그램이 꺼짐(숨고 싶다.._).... 센서와 300ms 간격으로 데이터를 주고 받는데....센서 데이터가 인식이 안됨.... 데이터는 겁나게 잘들어온다... 지금 필터로 인식이 된 부분만 걸러 낸건데...(csv 파일) 여기서부터,.,.. 키포인트 이걸 안해줌,.,...  출처 :https://learn.microsoft.com/ko-kr/cpp/c-language/maximum-string-length?view=msvc-170 최대 문자열 길이자세한 정보: 최대 문자열 길이learn.microsoft.com 근데... fRec_Flow의 배열의 수는 16개 저걸 12시간 켜놨으니...시간(초) = 12*60*60초당 약 3번그게 16개...... 더보기
Thread 파라미터 전달하기(왜 이걸 이제 알았을까...) 간만에 소스 분석 시간~~ 판정 프로그램 보고 있었는데 1년의 시간과 노력이 보상(?) 아님 헛... 어쨋든 뭔갈 알았다... (왜 스레드가 무조건 안될 거라 생각 했는지...)  스레드 파라미터 은근히 중요한게 이유가 있다:(개인 적인 의견임 )1. 스레드 번호 부여 - 스레드에게 ID가 있다고 하지만 파라미터에 int 하나만 넣어주면 배열 쓰기 편함...2. 과거 Tcp 통신 비동기 통신 할때 - 지금은 Task 방식을 쓰지만  옛날에 Tcp 사용 할때 소켓만 파라미터로 넘겨 줬더라면... ㅠㅠㅠ - 소켓 30개만 열어보면 index가 많이 중요함...(다른 분들은 어떻게 처리하는 지 모르지만.../ Dictionary 처리해서 코드 복잡해 지는 것보다.. 나은거 같음) 그리고 스레드 인스턴스 시에 .. 더보기
스레드 간섭 간 생긴 일 1편 요즘 진행 중인 프로젝트는 자이로 센서를 이용한 모터 오작동 감지 센서의 개수가 32개!!..... 그럼 소켓을 총 32 채널을 열어야 한다는 말이다... 또 Tcp 통신을 사용하다 보면 Reconnection이 매우 중요하다..고민하다 고민 하다 Dictionary와 Tuple을 같이 사용하려고 했는데.....(여기서 문제임...)   ... 위에 보면 tuple의 타입 개수는 총 3개 - 연결 상태와 채널의 번호, 그리고 해당 Tcpclient 소켓을 받아서 저장해서 사용하는 중이었는데.. Timer를 사용하여 연결 상태 값을 조회하여 false 전환 시에 Reconnection try 문을 작성하는 중이었는데.. 문제가 생겼다... 문제는 타이머와 connection Task와의 혼선... 타이머는.. 더보기
[C#] 클라이언트 재연결 및 수신 프로그램 만들기 델파이의 소켓 컴포넌트를 경험하고 난 후 그래도 c#에서도 그런 컴포넌트를 찾기보다 한번 해당 코드를 실제 업무에서도 적용 시켜보고 싶어서 작성 해봤다 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.Net; using System.Net.Sockets; using System.Threading; namespace TCP_model { public pa.. 더보기
TCP 통신의 패킷 처리하기(클라이언트 편) 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.Net; using System.Net.Sockets; using System.Threading; namespace TCP_model { public partial class Form1 : Form { Socket fSocket; Thread fRec_thread; Thread fReconnection; .. 더보기
Thread 작성 시 고려 사항 및 오류 사항 : 스레드가 실행 중이거나 종료되었습니다. 다시 시작할 수 없습니다. 개인적으로 프로그램을 현업에서 만들면서 C#의 장점을 들면 스레드를 첫번째로 떠올리곤 한다 기계제어와 스마트 팩토링 분야에서 일하고 있다보니 백그라운드에서 바이패스나 로깅을 기능을 중점으로 둔 프로그램을 자주 만들곤 한다. 현재 쓰고 있는 언어는 Delphi와 C#을 번갈아 가면서 쓰면서 스레드 기능이 사용하기 어려운 Delphi는 타이머로 대체해서 쓰곤 한다. 일정한 시간 주기로 작업 진행할 수는 없지만 소켓 서버나 패킷등의 바이트 값들을 저장하기에는 더없이 편할 수가 없다 메인 스레드에 크게 영향이 없어 쓰기가 편하다. 스레드를 사용하면서 오류 사항 및 해결 방법들을 노트 겸 올려 놓고자 한다. private void psThreading1() { while (fConnection) { fCnt++;.. 더보기
Smart Farm(스마트 팜)2 하..... 프로그램을 엎게 되었다...... 프로그램 자체 돌아가는 거는 문제가 없는데...... 컴퓨터 구조를 모른 상태에서 프로그램 짜기란 만만치 않다.... (이제 new의 의미를 알....았....) 단순히 Form1 폼이름 = new Form1(); 으로 객체를 생성해서 폼 다른 폼을 부르는 건... 위험하다.... (객체 생성은 무조건 한번.... 무조건....) 가장 상위폼에서 하위폼들을 객체 생성해서 상위 폼에서만 컨트롤 해야 됨을... 몰랐다.... 그래서 다시 만들꺼다~!!!!!~~~~ 이번엔 내가 만들고 싶은대로 말고 조건에 맞춰서 ... 일단 중간 결과물 먼저보자: 이름은 귀요미라고 했다 귀여워서 폼의 생성자 부분에 선택하는 폼을 폼이름.showdialog(); 모니터링 시스템 폼.. 더보기