안녕하세요?


이번 포스팅에서는 수요일에 있었던 CiMon Scada실습을 올려보고자 합니다.



먼저 언제나 그렇듯이 새로운 프로젝트를 생성하도록 합니다.



그리고 CiMonD에서 위 그림과 같이 디자인을 하도록 합니다. 이번 실습에서 그림을 그리는 것은 크게 중요한 것이 아니기 때문에 이렇게 합니다.



그리고 위 스크린샷처럼 스크립트를 생성 하도록 합니다. 내용은 간단합니다. 버튼의 태그가 ON/OFF이냐 여부에 따라서 펌프의 태그를 On/Off시키는 것입니다.



그리고 버튼의 태그값이 변하면, 위 그림처럼 스크립트가 실행되도록 합니다.



일단 CiMonX에서 제대로 작동은 되는 것을 확인할 수 있었습니다.



그리고 main()이라는 스크립트에서는 위와 같이 bodown이라는 스크립트를 작성 하도록 합니다.



그리고 SNUM이라는 아날로그 태그를 만들어 주도록 합니다.



여기서는 어느정도 복잡한 공식이 작용하기는 했지만, 결과적으로 보자면, 특정 조건에서는 압력이 증가 하도록 하고, 어떤 조건에서는 압력이 감소하도록 하는 것입니다.




그리고나서 태그값-SNUM을 나타낼 수 있는 값을 표시하도록 합니다.



그리고 SNUM의 최대값을 일정값으로 지정 하도록 합니다. 그리고 소수점 아래가 잘 나오지 않아서 FLOAT로 데이터 형태를 바꾸어 주도록 합니다.


CiMonX에서 제대로 작동하는 것을 볼 수 있었습니다.



그리고 이제 보고서용 데이터를 생성하기 위한 것을 지정 하도록 합니다.



다음으로는 위 스크린샷에 나와 있는 것처럼 데이터 수집을 열도록 합니다.



이제 세세한 설정에 들어가도록 합니다.



다음으로는 timeset()이라는 스크립트를 작성 하도록 합니다. 그리고 NOW()라는 함수로 현재의 시간을 불러 오도록 하고, 어제의 데이터를 수집하기 위해서는 DATEADD("n",-1,오늘을 의미하는 변수)를 집어넣어 주도록 합니다. 나머지는 함수의 이름에서 볼 수 있듯이 년/월/일/시/분/초를 입력합니다.


그리고 지금으로서는 잘 모르겠는 것이 바로 S$ = yr 이라는 위 스크린샷에 나오는 14번째 줄입니다.

일단 for문을 기점으소 10초간 감시를 하는 것은 맞는데, 단순이 $이 문자열을 의미한다고 해서 이렇게 붙는 것인지, 아니면 나중에 보여줄 문자열 함수를 어떻게 하는 것인지는 잘 모르겠습니다.


다음은 fsave()라는 스크립트를 만들어서, 여기서는 timestr이 파일명에 나오는 엑셀파일을 생성........이 아니라 기존에 나와 있는 파일을 복사하도록 합니다.




일련의 문자열 태그를 만들도록 합니다. 그리고 나서, R1이라는 그룹에 속해 있기 때문에 R1,RT1~R1.RT10까지 연결이 되도록 합니다.



그리고 보고서를 작성할 트리거를 만들기 위한 RE10이라는 디지털 함수를 생성 하도록 합니다.



그리고 버튼을 누르면 보고서가 생성 되도록 합니다.



버튼의 액션을정의 하도록 합니다.



이것으로 보고서를 작성할 것을 만들 준비를 다 마쳤습니다.



그리고 여기서는 보고서 모델 이름을 지정 하도록 합니다. 그러면서 모델이 될 엑셀 파일을 지정 하도록 하고, 어디다가 출력할 것인지도 지정을 하도록 합니다.



그리고 나서, 경로가 바뀌었기 때문에, 여기서는 filecopy라는 명령어에 새로 바뀌었는 경로를 지정 하도록 합니다.



그리고 셀 편집에 들어가서, 어떤 테그의 값을 어떻게 나올 것인지를 지정 하도록 합니다.



Dlogval이라고 해서 특정 태그의 값이 변경된 시점의 시각을 지정할 수 있는 명령어입니다.



그리고 어디다가 저장할 것인지 제대로 경로를 파악 하도록 합니다.




그런데 하다보니, 어딘가 에러가 발생하는 것을 볼 수 있었습니다.



일단 파일은 제대로 생성이 되었는데, 무언가 에러가 발생한 것을 알 수 있었습니다.



일단 수집모델을 지정하도록 하고, 다음으로는 스크립트상에 있었던 오류를 바로 잡도록 했습니다.



실제로 r1.rt라는 것이 태그의 이름인데, 이걸 잘못해서 ri.rt라고 잘못 입력이 되어서 뭐가 안되는 것이였습니다.



그리고 여기서 제대로 10초간에 보고서가 나오는 것을 볼 수 있었습니다. 이것으로 임의의 형식으로 보고서를 만드는 것은 성공했는데, 아직 이해하지 못한 것이 많다는 생각이 듭니다.

안녕하세요?


지난주 수업내용을 포스팅 하면서 많이 늣기는 했는데, 아무튼 이번 포스팅에서는 지난주 화요일에 있었던 수업의 내용을 포스팅 하고자 합니다. 지금까지는 터치라고 하는 컨트롤 장치의 유저 인터페이스를 디자인하는 툴로 XB builder를 사용했는데, 이번에는 무슨 관련이 있는지는 모르겠지만, 일단 EB8000이라는 프로그램을 처음으로 사용해 보았습니다.



우선 오전의 수업 내용인데, 일단 주어진 과제는 위의 내용과 같습니다. 여기서 중요한 것은 어느 타이밍에 어떤 램프가 켜지며, 정지 버튼을 누르면 둘의 패턴이 달라져야 한다는 것입니다.



일단 일차적인 래더 다이어그램을 완성하는 데는 성공했습니다. 여기서는 패턴 1이 완성되는 데는 성공하였습니다. 하지만, 이래서는 안되고, 이번 과제에서는 MOV명령어를 써야 한다고 합니다.



그래서 더 나은 패턴1의 구현은 했지만, 여전히 stop버튼은 문제가 있는 상황입니다.



MOV 명령이 워드에 하달 된다는 것을 계산해서 수행을 했습니다. 그래서 이렇게 정지 버튼을 구현하기는 했지만.....



그런데, 제가 미쯔비시PLC와 헷갈려서 인지, 여기서는 K라고 십진법을 표시하는 내용을 붙일 필요가 없었습니다.



그래서 여기 LS산전 PLC에서는 그냥 10진수의 숫자만 중간에 입력하는 선에서 마무리를 했습니다.



그리고 여기서야 나왔지만, P20의 워드안에 있는 특정 비트를 지정하기 위해서는 P22가 아니라 P202라고 입력해야 하는 것이였습니다. 그런데 이 방법을 쓰면, 패턴1을 실행하기 전에 정지버튼을 누르면 패턴2가 먼저 실행되어 버린다는 문제가 있었습니다.



그래서 이런 문제를 어떻게 해결했냐 했더니, 붉은 박스와 붉은색 밑줄의 조건을 추가해서 문제를 해결하는 것으로 했습니다.



이제 PLC를 연결하는데, 위 그림과 같은 XBC-DR32H의 경우에는 24V를 연결하는 것이 아니라, 220V를 직접 연결해서 한다는 차이점이 있었습니다. 위 사진에서 처럼, 직접 연결을 하였습니다.




다음으로는 EB8000이라는 프로그램을 실행 시키도록 합니다. 지금은 몰랐지만, 나중에는 이 프로그램을 이용해서 터치와 연결을 하고, 터치 장치를 통해서 PLC를 제어하는 단계에 들어가게 되었습니다. 먼저 EB8000 manager를 통해서 실행시키도록 합니다. 여기 있는 EasyBuilder8000을 눌러서 실행 하도록 합니다.



새로 만들기를 선택하고 나서, 확인을 누르도록 합니다.



그리고 나서, 모델을 지정 하도록 합니다.



먼저 실행을 시키고 나면, 기본적으로 터치만을 지정하도록-HMI만을 지정하다록 되어 있습니다. 그래서 새로 연결할 디바이스를 설정해 줘야 합니다. 새로 만들기를 눌러서 아래의 창을 불러 오도록 합니다.



이름은 임의로 지정을 해도 되지만, PLC I/F를 RS485 2W로 지정을 하도록 합니다. 물론 이것도 상황에 따라서 다르게 지정해야 할 때는 해야 합니다.



먼저 위 그림처럼 PLC기종의 옆에 있는 삼각형을 눌러서 불러올 것을 불러 오도록 합니다.



위 그림에서 처럼 LS industrial System을 선택하도록 합니다.



위 스크린샷처럼 LS-XBM/XBC Cnet으로 지정을 하도록 합니다.



위에서 언급한 대로, RS-485 2W를 지정해서 통신을 연결 하도록 합니다.



다음으로는 윈도의 장치관리자로 가서, COM설정에 들어가도록 합니다. 여기서 COM번호를 COM1로 바꾸도록 합니다. 왜 그렇냐 하면, EB8000에서는 COM1과 COM3만 지원하기 때문에 맞추어야 하는 것입니다.



다시 EB8000이란 프로그램으로 돌아와서 통신속도를 9600에 맞추어 주도록 합니다. 여기서 이런 속도하나 차이가 나도, 통신이 안되게 됩니다.




그리고 PLC기본 국번을 0으로 지정을 하도록 합니다.



이제 제대로 된 것을 하나 만드는 데 성공했습니다. 새로 완성된 시스템 파라미터는 HMI기기인 터치와 연결되는 통신을 제공해 줄 것입니다.


언제든지 시스템 파라미터를 바꾸어야 할 필요성이 있다고 하면, EB8000에서 편집 메뉴를 눌러, 불러오면 됩니다.



이제 디자인을 위한 작업에 들어가 보도록 합니다.



새 프로젝트를 만들도록 하고, 저장을 위한 작업까지 마무리를 해야 합니다.



다음으로는 XG5000에서 레더를 작성해서 집어넣어 주도록 합니다. 위 그림은 바로 그 래더 다이어그램을 짠 것입니다.



잠시 헷갈리기는 했는데, New PLC라는 항목에서 우클릭을 해서 PLC설정창이 나오는데, PLC와 연결하기 위해서는 이를 제가 쓰는 XBC-DR32H로 바꾸어 주어야 할 필요성이 있었습니다.



그렇게 PLC에 쓰기를 완료하였습니다.



그리고 나서, 디자인을 하기 위해서 라이브러리를 불러 오는데, 여기서도 상당히 많은 라이브러리가 있는 것을 볼 수 있었습니다.



이제 PLC와 연결이 되어 있기 때문에 온라인 가상 운전을 눌러서, 제대로 작동을 하는 지 여부를 알아 보도록 합니다.



일단 버튼등을 설정하는데, 실수록 스위치의 속성을 모멘터리로 설정하는 것을 잊어서 처음부터 다시 해야 했습니다.



제대로 나오는 것을 볼 수 있었습니다.



그리고 EB8000에서 디자인을 했는 모습입니다.




그리고 PLC기종은 Local HMI로 되어 있지만, 일단 컴퓨터 상에서 있는 값을 가지고 오기 위해서 위 그림처럼 선택을 해서 날짜를 가져오는 것을 선택하도록 합니다.



이제 램프에 불이 들어오는 것은 했기 때문에, 이번에는 날짜를 나타내는 것을 하고자 합니다.



위 스크린샷에 나와 있듯이, Common이라는 스트린에서 이렇게 년,월,일,시를 추가하도록 합니다.



그리고 제대로 나오는 것을 볼........수 없습니다. 어딘가 문제가 있다는 생각이 듭니다.



알고 봤더니 데이터 형식을 위 스크린샷에 나왔는 것 처럼, 16Bit-BCD로 하도록 합니다. 이렇게 하고 나서야 뭐가 제대로 나오는 것을 알 수있었습니다만, 그래도 지금의 단계에서는 무언가를 제대로 알기는 어렵다는 생각이 듭니다. 이게 무엇인지 제대로 알 수 있었는 것은 사실상 목요일의 수업을 듣고 나서야 제대로 알 수 있었습니다.




안녕하세요?


오랫만에 시간을 내서, 부산시의 정관 신도시에 새로 생겼다는 영풍문고를 방문해 보았습니다. 일단 부산에 있는 신세계 백화점 센텀시티점 지하에 있는 반디 앤 루니스에 비해서 상당히 작은 편이기는 했지만, 그래도 어느정도는 구색은 갖추기는 갖추었다는 생각이 들었습니다.



위에 첨부된 지도를 보시면, 정관 CGV에 있다고 나와 있습니다. 실제로 CGV 건물 1층에 있었는데, 문제는 건물 자체의 공사가 다 끝나지 않아서 인지 몰라도, 아직은 건물 전체가 텅 비어있는 듯한 느낌이 들었습니다.



정문 입구에서 한컷을 찍었습니다. 멀리서 봤을 때는 안이 상대적으로 어두운 탓인지 아무도 없다는 느낌이 들었습니다만, 그래도 가까이 가니 사람이 있다는 것을 느낄 수 있었습니다. 



가장 먼저 들어가서 왼쪽으로 고개를 돌리니, 무언가 커피 스탠드가 있으면서, 조금은 좁은 느낌이 들기는 들었습니다. 그래도 오른쪽으로 고개를 돌리니......



아랫쪽으로 내려가는 계단과 함께 상대적으로 넓은 공간이 펼쳐지는 것을 볼 수 있었습니다. 여기서 보면 상대적으로 공간이 생각외로 넓다는 것을 알 수있었는데, 아무래도 밖에서 봤을 때 사람들이 없는 것으로 느껴진 이유가 상대적으로 아랫쪽으로 내려간 지형에 사람들이 몰려 있어서 였는 것으로 보였습니다.




아래로 내려가자 먼저 나오는 것은 재테크를 비롯해서 경제학과 경영학에 관련된 서적이 전시되어 있는 것을 볼 수 있었습니다.



그 옆엔느 순수하게 문학.....이라고 하기에는 아무튼 판타지 소설이든 무협지든 아니면 일반적인 소설이든 문학작품이 전시가 되어 있는 것을 볼 수 있었습니다.



얼마나 많이 있는지는 모르지만, 듣자니 정관은 신도시라고 해서 학원이 많다고 들었는데, 아마 이런 원인으로 인해서 인지는 몰라도, 외국어 서적과 더불어서 라이트 노벨과 만화 서고는 상당히 빵빵한 편이기는 했습니다.



그에 비해서 주변에 커다란 대학교가 없다 보니, 순수 자연과학에 관한 책은 상당히 적은 것을 볼 수 있었습니다. 그래도 아예 없는 것도 아니고, 이렇게 소량이나마 있는게 어디인가 하는 생각이 들었습니다.




외국어 서적이 있는 커다란 서고를 지나서, 자연과학 서적이 있는 곳의 바로 뒷쪽을 보자, 거기서 부터는 문구류를 취급하고 있는 것을 볼 수 있었습니다. 



조금더 들어온 입구쪽으로 걷자, 거기에는 각종 전자기기를 취급하고 있는 것도 볼 수 있었는데, 그렇게 까지 규모는 크지 않다는 느낌이 들었습니다. 그래도 생수병에 꽂아서 바로 쓸 수 있는 가습기까지 취급하고 있는 것을 볼 수 있었습니다.



여기서 서서히 아쉬운 점이라면 아쉬운 점이 나오고 있는데, 이 서점의 거의 절반에 해당하는 면적이 문구류와 각종 전자제품과 완구류를 파는데 집중이 되어 있었습니다. 그러면서도 면적이 좁아서 생긴 문제인지 '음반'을 취급하고 있는 코너는 없었다는 것입니다.



이제 뒤를 돌아서 나아가자, 그곳에는 어린이용 서적을 파는 코너가 상당히 크게 열려 있는 것을 볼 수 있었습니다. 아무래도 신도시라고 하다 보니, 어린이들이 많아서 이런 현상이 벌어진 것이 아닌가 합니다.




그리고 그 옆에는 취미, 예술 항목의 서적이 많은 것을 볼 수 있었습니다. 여기서 볼때 상대적으로 자연과학기술 관련된 서적이나 컴퓨터에 관련된 서적의 비율은 상당히 적은 것을 볼 수 있었습니다. 그래도 여기서 나와 있는 취미, 예술 계열의 서적만 보자면, 시내에 있는 대형 서점을 갈 필요는 없어 보인다고 할 정도로 상당히 충실해 보였습니다.



이제 이 서점의 탐방도 거의 다 끝나가서, 들어올 때 왼쪽에 있었는 커피 샵이 있는 것을 볼 수 있었습니다. 그런데 어딘가의 브랜드인지는 모르겠지만, 카페의 브랜드도 처음보는 브랜드라는 것을 볼 수 있었습니다.



커피 스탠드를 지나서 있는 잡지 코너에는 그렇게 까지 과학기술 관련된 잡지는 많지는 않다는 것을 볼 수 있었습니다. 대신에 시사나 뉴스에 관련된 잡지는 상당히 많이 있는 것을 볼 수 있었습니다.



마지막으로 커피 한잔을 하면서 포스팅을 마치고자 합니다. 그렇게 까지 크지는 않았지만, 그래도 부산에서 먼 곳에 생겼는 대형서점이라는 점에서 의의는 있다는 생각이 듭니다. 다만, 자연과학 서적에 대해서 그렇게 많이 비치는 하지 않은 점은 아쉽다면 아쉬운 점이기는 했습니다.


이 장소를 Daum지도에서 확인해보세요.
부산 기장군 정관읍 매학리 717-5 조은플러스 9~11층
도움말 Daum 지도

안녕하세요?


드디어 길고 내용도 많았던 하루의 수업 내용을 다 정리해서 올리는 시간이 되었습니다. 이번 포스팅에서는 과제로서, FIFR과 FIFW 명령을 이용하여 버튼 4개에 번호를 매기고, 몇 번 버튼을 언제 입력했는지 입력 순서를 저장한 다음, 번호에 해당하는 램프가 차례대로 점등이 되도록 하는 과제입니다.



일단 일차적으로 래더를 완성하는 데는 성공했습니다. 각각의 버튼마다 해당하는 고유의 값을 10진수로 D100에 입력하게 하는데, 나중에 FIFR명령으로 D100에 있는 명령을 가지고 오는 것으로 하도록 했습니다.




그리고 GT designer에다가 위와 같이 디자인을 하도록 합니다.



일차적으로 시뮬레이션을 돌렸습니다만, 제 의도와는 많이 다르게 움직이는 것을 확인할 수 있었습니다.



알고 봤더니, 컴파일링이라고 해야 할까요? 래더에 적용할 수 있는 기계어로 ladder diagram이 변형이 되면, 위 스크린샷에 오랜지색 박스친 곳이 변형되어서, 하는 수 없이 위 스크린샷과 같이 오류를 수정해야만 했습니다.




그래서 마지막으로 오류를 수정하고 나서, 시뮬레이션을 돌린 결과입니다. 제대로 제가 입력한 순서를 PLC가 기억했다가 나중에 순서대로 출력하는 것을 보여주고 있습니다. 이 명령어를 이 날 하루동안은 제대로 이해하기는 했으며, 어렵기는 하지만 나중에 어디에 사용이 될 것인지 모르겠다는 생각이 듭니다.

안녕하세요?


하다보니 좀 많이 늦기는 했는데, 아무튼 이러니 저러니 해도 지난주 초에 있었던 수업의 내용을 다 정리하는데, 너무 양이 많아서 정리하는 데 시간이 걸리기는 걸리는 중입니다. 아무튼 이번 시간에는 좀 이해가 어렵기도 하면서, 어떨 때는 유용할 수도 있는 명령어를 실습하였고, 그 내용을 포스팅하고자 합니다.



먼저 FIFW를 실습해 보기 위해서 일련의 래더를 만들어 놓았습니다.



그리고 GT designer에서 일련의 디자인을 하도록 합니다.



이제 시뮬레이션을 돌리도록 하겠습니다.



일단 3이라는 값을 디바이스 D101~D105까지 입력을 하는 것을 볼 수 있습니다. 여기서 중요한 것은 D100만 지정을 했지만, 나머지 아래의 디바이스는 알아서 지정이 된다는 것입니다.


그리고 중간에 3을 입력하다가 4로 바꾸자, 값이 바뀌어서 입력이 되는 것을 볼 수 있습니다. 이렇게 바뀌는 값을 가장 큰 숫자의 디바이스에다가 '쓰는' 역할을 하는 것을 FIFW라고 볼 수 있습니다.



이제는 FIFR을 실습해 보기 위해서 래더를 짠 것입니다.




GT designer에서 새로운 버튼을 하나 추가하고 나서, 다시 실습에 들어가 보도록 합니다.



시뮬레이션을 작동 시킨 모습입니다.



일단 GIF파일로 만들어서 한번 나타내 보기는 했지만, 이 때 까지만 해도 어떻게 움직이는 지는 모르겠습니다.



일단 FIFR에 에러를 방지하기 위해서 D100이 1이상일 때만 작동할 수 있도록 조건을 걸어 두도록 합니다.



그리고 여기서 rising edge로 바꾼 이유는 바로, 버튼을 계속 눌렀을 때, 연속해서 값이 번지는 것을 막기 위해서 이와 같이 상승엣지를 사용했습니다.


그리고 FIFR의 실습을 위해서 확인해 보고자, 위 스크린샷과 같이 모양을 맞추어 놓았습니다.



일단 결과부터 말하자면, FIFR이라는 명령어는 D101에 저장이 되어 있는 데이터를 D200으로 옮기고, D101의 자리에 D102의 데이터부터 하나씩 올린다고 보면 됩니다.


그리고 GIF파일로 작동하는 모습을 묘사했습니다. 실제로 D101의 값이 D200으로 옮겨지고, D105에서 부터 저장된 데이터가 위로 올라가는 것을 볼 수 있습니다.




그리고 다음으로는 FPOP와 관련된 FDEL과 FINS에 관해서 실습을 하고자 빨간색 박스에서 보이는 부분의 래더를 추가하였습니다.



GT designer에서 관련된 내용을 디자인 하도록 해 봅니다.



이제 FPOP를 실험해 보기위한 시작 화면입니다.



FIFR과는 다르게, 끝 꼬리에 해당하는 D105부터 데이터를 빼서 D200에 넣는 것을 볼 수 있습니다. 그래서 후입선출이라고 불리는 이유가, 바로 꼬리 부분부터 빼서 옮긴다고 해서 붙여진 이름이 아닌가 하는 생각이 듭니다.



이제 FDEL과 FINS를 실습해 보기 위해서 작업에 들어가 보도록 합니다.



먼저 FDEL을 실행하자, D101부터 3을 세어서 3번째 자리에 있는 D103에 있던 5라는 데이터를 빼서 D200에 보내는 것을 볼 수 있었습니다.



실제로 D103부터 차례대로 빼서 D200에 들어가는 것을 볼 수 있었습니다.



그리고 혹시나 싶어서 D200 이외에도 데이터가 저장이 되는가 싶어서 찾아보니, 그건 없었습니다. 이건 생각해 보면서 작업을 해야 겠다는 생각이 들었습니다.



그리고 이번에는 FINS를 실험해 보도록 했습니다. K3라고 지정을 해 놓으니, D101을 포함해서 3을 세어서 D103에서 부터 7이라는 값을 집어 넣는 것을 볼 수 있었습니다. 이것으로 일련의 FIFW, FIFR, 후입선출인 FPOP와 FDEL, FINS를 확인하는 데 성공했습니다. 이제 남은 것은 마지막으로 실행을 한 과제에 대해서 포스팅을 해서, 수업의 내용이 많았던 하루의 내용을 모두 포스팅 하겠습니다.

안녕하세요?


이번 시간에는 많은 사람들이 헷갈려 하고 있는 MOV명령과 BCD라는 PLC의 ladder diagram에서 나오는 명령어에 대해서 포스팅을 하고자 합니다.



먼저 MOV명령에 대해서 설명에 들어 가고자 합니다. 뭐라고 해야 할까요? PLC도 어떻게 보면 초소형 컴퓨터와 비슷하다고 할 수 있는데, 여기에도 CPU가 들어가 있습니다. 당연히 data(데이터)를 넣기 위해서는 2진수로 변환이 되어야 하며, 이를 PLC의 메모리에 넣는데, 문제는 어디에 들어가는 것이냐 하는 것입니다.



그래서 이 데이터의 단위가 주로 '워드'라고 하는 단위로 저장이 된다고 보시면 됩니다. 그래서 이 단위를 워드라고 해서 16개의 비트로 이루어져 있습니다.



그리고 이 1개의 워드 안에서는 뭐라고 해야 할까요? 16개의 비트라고 해서, 얘네도 각각의 주소가 있는데, 비유하자면 워드는 아파트의 '호수'라고 부를 수 있고, 각각의 '비트'는 한개의 아파트 호에 있는 '방의 번호'라고 보시면 될듯 합니다. 예를 들면 P10이라는 워드의 P10F라는 비트아파트 108호에 있는 16번 방 이라는 식으로 부를 수 있다고 보시면 될 듯 합니다.



그래서 위 그림과 같이 83이라는 10진수의 숫자가 2진수로 변형이 된 다음에, P0라는 워드에 들어가서 각각의 비트를 1로 만든다-전구로 치면 ON을 시키는 것을 볼 수 있습니다.



지금까지는 LS산전 PLC에 대해서 알아본 것인데, 미쯔비시 PLC에서도 사용이 가능한지 알아보니, 다를 것 없이 이 부분에서는 공통적으로 사용할 수 있다는 것을 알 수 있었습니다. 지금으로서는 크게 와 닿지는 않지만, 나중에 대량의 출력점을 제어해야 하는 상황에서는 상당히 필요성이 있다는 생각이 듭니다.





이제부터는 BCD 명령어에 대해서 이야기를 하도록 해 보겠습니다. BCD명령은 복잡한 설명이 있지만, 제 경우에는 피부에 와 닿는 표현이라고 하면, 10진수의 수가 원래는 위 그림에 있는 것처럼 실제로는 2진수로 변환되어 저장이 되어 있습니다. 그걸 각각의 자리수를 끊어 준다고 보시면 됩니다.



그래서 워드에는 어떻게 저장이 되느냐 하면, 위 그림의 묘사와 같은 방식으로 저장이 됩니다. 즉, 이전에는 1234를 글로 쓰면, 일천 이백 삼십 사 라고 해서 1000+200+30+4의 구성이 되었다면, BCD명령어가 실행이 되고 나면, 1 / 2 / 3 / 4 로 한자리씩 떨어지게 됩니다.



그런데 PLC의 래더상에서 보면, 위 그림과 같이 1234를 BCD 명령을 받은 다음에, Y60이라는 디바이스 공간에 4660이라는 숫자로 저장이 되는 것을 볼 수 있습니다. 많은 사람들이 헷갈려 했는데, 왜 이런 결과가 나왔는 가 하면, 바로 아래와 같은 연산이 있었기 때문입니다.



즉 Y60이라는 워드-때로는 디바이스라고도 불이는 이 할당된 공간에다가 1234의 값이 한자리씩 끊겨서 2진수 형태로 저장이 되면, 래더 상에서는 이 값들의 합계를 보여주어야 하는 것입니다. 그래서 위 그림의 묘사에 나오는 연산처럼 모든 한계가 10진수로 표현하면 4660이 되는 것입니다.



물론 여기서 4660이라는 것은 겉으로 보이는 것이고, 실제 본질은 BCD명령을 받아서 변환이 된 데이터라고 보시면 됩니다. 이제 이러한 상태에서 SEG라고 세크먼트 디코더 명령어를 받게 되면, FND에서 숫자로 표현할 수 있는 형태로 바뀔 준비가 끝난 것입니다.


지금은 아무것도 아닌것 같다는 느낌이 들지만, 아마 조만간에 나오는 실습에서 이게 얼마나 큰 역할을 하게 될지 모르겠습니다만, 실제로는 상당히 중요할 것이라는 생각이 듭니다.

안녕하세요?


이번 포스팅은 이번주 월요일에 있었는 수업의 내용을 모두 포스팅 할 예정이였습니다만, 수업 안에 들어간 내용이 너무 많아서 하는 수 없이 최소한 2 부분으로 나누어야 했습니다. 그래서 이번 포스팅에서는 XCH라고 해서 데이터를 바꾸는 식의 명령을 사용하고, 다음으로는 for, next문을 PLC의 래더에서 구현하는 것을 포스팅 하고자 합니다.



먼저 등장하는 XCH가 나옵니다. 이 명령어는 16비트=1워드 단위로 디바이스 간의 데이터를 바꾸라는 것을 명령합니다. 그래서 아래와 같이 사용을 하게 됩니다.


[XCH D1 D2] -> D1과 D2에 있는 워드를 서로 교환하라.



GT designer에서 위 스크린샷과 같이 한번 준비해 보도록 합니다.



그리고 시뮬레이션을 돌리도록 해 봅니다.



실제로 D1과 D2에 들어가 있는 데이터가 서로 바뀌는 것을 확인할 수 있습니다. 위 스크린샷에서는 25와 20이 서로 바뀌는 것을 볼 수 있었습니다.



XCH가 16비트=1워드 단위로 바꾸었다면, 이번에 나온 SWAP이라는 명령어는 8비트=1바이트 단위로 1개 워드 안에 있는 데이터의 앞뒤를 바꾼다고 합니다. 실제로 이런 것이 나오는 지를 살펴 보도록 하겠습니다.


먼저 GT designer에서 대충 디자인을 하고나서, 다음에는 시뮬레이션을 돌렸습니다.






실제로 바뀌는 것을 볼 수 있었으며, GIF파일로서 제대로 보여 드리겠습니다.



SWAP라는 명령어가 1개 워드 안에서 1바이트 단위로 앞과 뒤가 바뀌어서 마지막에 나오는 값이 달라지는 것을 볼 수 있었습니다.



실제로 SWAP명령어가 어떤 식으로 데이터를 바꾸는 지를 볼 수 있습니다. 복잡하기는 하지만, 간단하게 설명을 하자면, 중간을 잘라서 앞뒤를 바꾼다고 보면 속이 편합니다.


먼저 SWAP라는 명령어를 실행하기 전에 디바이스 안에 저장되어 있는 데이터입니다.



SWAP라는 명령어를 실행시키고 나자, 앞뒤가 바뀌는 것을 볼 수 있습니다.



위 스크린샷에 나있는 SM400으로 나오는 것이 아래에 있는 BCD명령어를 풀어 쓴 것입니다. 우선 시뮬레이션을 작동시켜서 어떻게 움직이는 지를 보여 드리겠습니다.



실제로 BCD명령어를 실행시킨 결과와 같이 나오는 것을 볼 수 있습니다. 옥에 티라면 티라는 것이 제가 어느정도 오타가 나와서 뭐가 제대로 나오지 않았지만, 어쨋든 BCD라는 명령어 하나만 쓰면 되는 것을 이렇게 어렵게 풀어써야 하는 것을 볼 수 있습니다.





그리고 위에 나와있는 매뉴얼에 있는 나눗셈(/)에 대해서 보여주고 있습니다. 일단 [/ k1 k2 d1] 이라고 해서 k1/k2를 나누기 사칙연산을 하고나서, 그 몫을 D1에 저장하겠다는 것입니다. 그리고 D2에서는 특이하게도 아무런 명령을 지정하지 않았지만, 나머지를 D+1이라고 해서 D2에 나머지를 저장하는 시스템이 있습니다. 절대 나머지를 구하는 다른 연산자가 있지 않고, 나눗셈 연산자가 자동으로 지정을 합니다.



실제로 / 연산자를 사용해서 1234라고 하나로 묶어진 값들이 하나하나 짤라지는 것을 볼 수 있습니다.



그리고 XCH 없이 하니 이상한 값이 나오는 것을 볼 수 있습니다. 왜 이러는 지는 모르지만, 아마도 4321이 되는 것을 볼 수 있어 보입니다.




결국 XCH명령어까지 지정하고 나서야 제대로 된 값이 나오는 것을 볼 수 있었습니다.



위 스크린샷은 For Next문의 설명 부분을 가지고 온 것입니다.



그리고 첫번째 과제로서 For문을 참고해서 나누기 연산을 이용, 소수점 4자리까지 표현 되도록 구현하라고 과제인데, 첫 시도는 무언가 무리여서 도저히 잘 안되었습니다.



일단 위 스크린샷에 나오는 것이 정답입니다. 우선 -[FOR K4] 라고 하면 For문을 앞으로 4회 실행 시키라는 명령이 됩니다. 그리고 이 For문은 -[NEXT}까지 자기들 4회를 다 끝나고 나서 래더의 1회 스캔이 끝나기 때문에, For문이 반복실행에 우선권이 있다고 보시면 됩니다.



D10에 7을, D11에 6의 값을 대입에서 제대로 작동이 되는 것인지 한번 보려고 합니다.



먼저 설명을 해야 되는 것이 있는데, For문을 사용하기 위해서는 Z0라고 하는 인덱스가 필요한데, D30Z0의 의미는 다음과 같이 됩니다.


D30 + Z0


그런데 이것은 사칙연산을 한 결과값이 아니라, 번지수가 달라진다는 것을 볼 수 있습니다. 즉 위 스크린샷을 보시면 다음과 같이 구성이 되어 있는 것을 볼 수 있습니다.


제일 먼저 [MOV K1 Z0]라고 해서, Z0를 초기화 시킨다고 볼 수 있습니다. 그래서 For문이 시작하자마자 D30Z0는 D30 + 1이 되어서 D31이라는 디바이스의 번호가 됩니다.


그리고 -[NEXT] 위에 있는 [+ K1 Z0]라는 것을 보면, Z0라는 인덱스의 값이 1에서 +1씩 증가하게 되는데, 결과적으로 D31, D32, D33, D34에 데이터를 저장하게 됩니다.



실제로 D31부터 데이터가 저장이 되는 것을 확인할 수 있었습니다.



GT designer에서 일단 디자인을 하도록 합니다.



시뮬레이션 결과 제대로 뜨는 것을 확인할 수 있었습니다. 일단 급하게 정리를 하기는 했는데, For Next문에 대해서 추가적인 설명이 필요한게 아닌가 하는 생각이 들기도 하는데, 언제 이 밀린 포스팅을 다 하고 나서 새로 PLC의 For Next문을 더 자세하게 정리할 수 있을지는 모르겠습니다.

안녕하세요?


드디어 이 블로그를 했는 것도 1년을 맞이했습니다. 그래서 블로그 결산을 해서 뭐가 나올 것이 제대로 많이 나오기는 나왔습니다. 일단 하나하나 살펴 보도록 하겠습니다.



어째 하다하다 보니 1년에 글을 365개 이상 포스팅을 작성하는 데 성공했다는 생각이 듭니다. 다만, 이 포스팅 하나가 무슨 고전명작이 될 수준은 아니기는 합니다만........ 예, 어떻게 1일 1포스팅은 성공하기는 성공했네요.



어째 많이 언급한 이야기에서 포스팅이 눈에 띄는 게....... 매번 글을 쓸 때마다 이번 포스팅 이라고 하다보니 이런 결과가 나왔다는 생각이 듭니다. 그래도 하도 오랫동안 과학잡지를 읽어서 블로그 포스팅 꺼리를 사냥하다 보니, 기사라는 것이 많이 나온게 아닌가 합니다. 



개인적으로 지난해 추석때 갑자기 접속자가 폭주하는 것을 보았습니다. 그리고 그 이후로는 접속자가 저렇게 폭주하는 것을 다시는 볼 수 없었습니다.그래도 꾸준하게 블로그를 작성하니까, 어떻게 접속자가 조금씩은 많아지는 것이 나오는 듯 합니다. 



명색이 과학 블로그인데, 정작 과학관련 기사는 사람들이 그다지 많이 읽지 않았다고 해야 할까요? 이런다고 이제와서 코스트코 블로그로 바꿀수도 없고, 이래저래 저 남성용 피임약에 잡힌 fire egg가 제 egg인 심정입니다.



접속자가 하루에 그렇게 많지 않다보니, 공감을 많이 받지는 못한다는 생각이 듭니다. 그래도 공감이 나왔다는 것 자체가 얼마나 대단한 것인지 생각하면, 이것도 많이 발전한 것은 것이라는 생각이 듭니다. 예 처음 블로그를 시작한 것은 2016년 11월 말이였는데, 그때는 100명 방문자 나왔다고 좋아했었습니다. 지금은 200~300명대 사이의 사람들이 방문하는데, 처음에 비하면 많이 방문자가 늘었다는 생각이 듭니다. 


2018년에는 어떤 과학과 기술에 관한 내용을 포스팅을 할 수 있을지 모르겠지만, 그대로 포스팅은 계속될 것입니다.

  1. 책덕후 화영 2018.01.10 14:24 신고

    포스팅의 성격이나 횟수, 방문자 수나 양상 등이 제 블로그랑 많이 비슷하네요. 저도 몇일 후에 블로그 결산 관련 얘기를 할 예정입니다만... 주로 많이 쓴 건 책 리뷰인데, 오히려 IT얘기나 특정 연예인(누군지는 알거에요) 얘기가 조회수가 높다고나 할까요?

안녕하세요?


이번 포스팅에서는 목요일에 있었던 LS산전 PLC를 가지고서 디바이스 메모리에 관련된 영역을 가지고서 실습을 하였고 그 내용을 포스팅하고자 합니다. 



먼저 언급해야 하는 사항으로는, 모든 컴퓨터가 그렇지만, PLC도 일종의 컴퓨터처럼 데이터가 입력이 되면, 이를 2진수의 코드로 바꾸어서 저장을 한다는 것입니다. 이를 의식해서 항상 생각을 해야만 합니다.



그렇게 먼저 4라는 값을 MOV명령어를 이용해서 P2라는 디바이스에 집어 넣도록 하는 것입니다. 여기서 중요한 것은 MOV명령어에 지정이 된 디바이스 P2라는 것은 '비트'가 아니라 '워드'를 의미한다는 것입니다.



실제로 PLC 디바이스 모니터를 보면, 위 스크린샷과 같이 여러개의 0이 표시되어 있는 것을 볼 수 있는데, MOV 명령어를 먼저 실행해 보도록 하겠습니다.



위에서 보면 P2라는 워드안에 4라는 값이 저장되어 있는 것을 볼 수 있습니다.



이 값을 2진수로 바꾸어 보면, 위 스크린샷과 같이 워드단위에는 4라는 온전한 값인지는 모르지만, 그 안에는 2진수로 0과 1이 바뀌는 것을 볼 수 있습니다.



위 그림에서 표현을 하자면, MOV에서 지정을 한 것은 P0라는 워드입니다. 이 워드 안에는 2진수로 표현하면 16개의 0이 들어있는 형태입니다. 그걸 위 그림에서는 '불이 안 켜진 전구'로 표현을 했습니다. 그럼 여기서 비트는 어디 갔느냐고 하실 건데, 바로 비트가 '전구 한개'입니다.




그래서 어떤 숫자가 들어오든 간에, 일단 들어오는 숫자는 '워드 단위'로 저장이 되고, 그 데이터는 2진수로 변환이 되어서, 각각의 비트를 ON시키게 됩니다. 지금까지는 스위치를 켜고 끄는 상황에서는 '비트단위'로 충분했지만, 여러개의 스위치를 다루게 되면 이제 이런 워드 단위를 다루어야 합니다.



그리고 헷갈리기 쉬운것이, 이 비트의 주소입니다. 예를 들어서 P20이라는 워드 안에 들어간 비트 하나를 지정하고 싶으면 'P20 + n'이라고 해서 'P20바로 뒤에 덧셈이 아니라'그냥 숫자가 붙는 형대가 됩니다.



그래서 P2라는 워드안에 들어가 있는 비트를 모두 ON 시키고 싶으면 최대값을 입력하면 됩니다. 즉, 워드가 수용할 수 있는 최대값을 입력하면 된다는 것입니다.



실수로 값을 초과했는데, 최대값을 65535라고 합니다. 지금 생각해보면 그냥 사칙연산으로 저 최대값에 도달을 할 수 있을지 의문이기는 합니다.



일단 최대값이 입력이 되어서, P2라는 워드안에 있는 모든 비트의 값이 전부 ON=1이 된 것을 볼 수 있었습니다.



이제 2진수로 숫자를 어떻게 바꾸냐 하는 문제가 남았는데, 이 문제는 간단하게도, 윈도에서 기본적으로 제공해 주는 계산기에 있는 프로그래머용 이라는 것에 들어가면 해결이 될 수 있었습니다.




위에서처럼 워드의 최대값도 문제없이 구할 수 있는데, 문제는 하다보면 특정 비트만을 켜야하는 경우가 생깁니다. 이럴 경우 2진수를 일일히 계산해서 10진수로 변경할 게 아니라, 계산기에서 Bin을 클릭해서 2진수로 입력을 하고, Dec를 눌러 10진수로 변환하면 간단히 해결이 됩니다.



그래서 이번에는 16개나 되는 램프를 건드려야 하는 과제인데, 이런 것을 예전이라면 출력을 16개 만들어서 래더상에서 16줄이 발생했을 가능성이 굉장히 높습니다.



그러나 이렇게 특정한 조건이 될 때, 래더에서 특정한 값을 MOV명령어를 사용해서 입력하면 이를 간단하게 해결할 수 있었습니다. 이제 그 결과가 제대로 나오는 지를 확인해 보아야 합니다.



우선 제대로 각각의 램프가 각각의 P2라는 워드 안에 들어간 비트와 연동이 되어 있는지를 확인해야 합니다.



시뮬레이션을 돌리도록 합니다.



제대로 일련의 동작이 되는 것을 확인할 수 있었습니다. 문제는 0이 짝수인지 홀수인지 몰라서, 일단 빼 놓았다는 것이 있기는 했습니다.



이제 두번째 과제를 할 때가 왔습니다. 이 과제에서는 첳ㅅ번째로 스위치를 눌렀다가 뗄때는 아무런 일이 일어나지 않다가, 두번째 부터는 P20이 켜지고, 세번째 누르면 P21이 켜지고 난 다음에 P20이 1초 뒤에 꺼집니다. 그리고 네번째로 버튼을 눌렀다가 떼면 P22가 켜지고 P21이 1초 뒤에 꺼집니다.




다섯번째로 버튼을 눌렀다가 떼면, 이번에는 P20이 켜지고, P22가 1초 뒤에 꺼지도록 해서, 계속 반복이 되면 OK이 인 과제입니다. 먼저 위 스크린샷처럼 래더를 작성하도록 했습니다.



그리고 나서 XB builder에서도 버튼을 눌렀을 때에만 ON이 되도록 지정을 하도록 합니다.



그리고 이번에도 제 의도대로 작동을 하는 것을 확인할 수 있었습니다.



이제 세번째 과제에 들어간 상황입니다. 과제의 내용은 단순했으나 수행은 어려웠는데, 내용은 일단 플릭커 회로라고 점멸을 하는 회로가 있는데, 이걸 원래는 타이머가 2개 들어갑니다. 이걸 타이머 한개만으로 구현하는 것이라고 합니다. 일단 위 스크린샷의 래더처럼 시도를 했을 때, 오류가 생긴게, D로 시작하는 디바이스로는 A나 B접점을 만들 수 없어서, 하는 수 없이 P로 바꾸어야 했습니다.



그리고 정답인 회로입니다. 여기서 핵심이 되는 것은 FF라고 적혀진 이 플립플롭회로입니다. 그런데 여기서는 그냥 FF라고 지정이 되어 있지만, 이를 풀어서 쓰면 아래와 같이 됩니다.



위 스크린샷에서 붉은색 박스안의 내용이 FF M1을 풀어쓴 내용이고, 특히 처음보는 -(P)- 라는 것이 있는데, 이게 바로 양변환 검출 코일이라고 해서, 0에서 1로 변하는 것을 감지하는 코일이라고 합니다. 즉, 이게 바로 FF m1을 풀어쓰는데 가장 핵심이 되는 파트라고 할 수 있습니다.



그렇게 해서 제대로 작동을 하는 것을 마지막으로 확인을 할 수 있었습니다. 조금은 어렵기는 하지만, 단 한줄로 16개나 되는 램프를 켜고 끄는 것을 생각해 보면, 이는 가볍게 넘겨서는 안되겠다는 생각이 듭니다.

안녕하세요?


이번 포스팅에서는 이번주 수요일에 있었던 수업의 내용중 오후 수업에 해당하는 내용으로, PLC기기 자체에 어떻게 하면 숫자를 각각 하나하나의 램프에서 표시를 하며, 이 숫자를 이용해서 사칙연산이 가능한 계산기까지 만드는 것입니다. 일단 이 과제를 해결하기 위해서 작업에 들어갑니다.



먼저 2자리의 숫자가 입력되지 않도록 -9에서 9사이의 값만 입력이 되도록 만들어 줍니다.



한번에 모든 걸 할 수는 없으니, 우선 첫번째 입력되는 숫자를 표시하는 패널의 부분을 만들어 보도록 합니다.



위 스크린샷과 같이 버튼을 먼저 구현해 주도록 합니다.



위 그림과 같이 첫번째로 구성을 하기는 했는데, -의 수가 입력이 되면 어째서 인지 오류가 발생하였습니다. 그래서 뭐가 문제인가 했더니, 연산을 하기 위해서 데이터를 저장하는 D디바이스는 따로 두고, 숫자를 표현하기 위한 디바이스도 따로 두어야 한다는 것이였습니다.



그래서 이번에는 위와 같이 계산을 위한 D0 디바이스를 두어서 여기에는 -의 음수값도 두고, D1이라는 디바이스를 따로 만들어서 여기다가 D0의 값을 집어넣은 다음, 무조건 양수로 만든 뒤에 BCD연산을 하고, SEG명령어로 디코더를 통과하게 합니다.


이제 음수의 표현은 되는데, 문제는 0이 표현되지 않는 문제가 발생하였습니다.



그래서 어디가 문제인가 했더니, 위 스크린샷에 나오는 빨간 동그라미 친 부분이 문제였습니다.




그리고 한개의 입력숫자를 표시할 수 있는 패널 부분이 완성되면, 나머지 부분은 일단 붙여넣기를 해서 GT Designer에서 나오도록 만들어 줍니다. GX works2에서 나오는 래더는 복사한 다음, 디바이스 번호를 일단 다르게 하는 것으로 했습니다.



다음으로는 사칙연산을 하면서도, 리셋버튼이 될 래더 로직도 만들어 주도록 합니다.




그리고 일련의 로직을 짜도록 합니다. 이건 어디까지나 첫 시도이고, 일단 DIS명령어를 이용, 2자리수가 될 사칙연산 결과값을 한자리씩 나누도록 합니다.



우선 GT designer에서 위 스크린샷처럼 디자인을 하도록 합니다.



다른 건 다 되는데, 5X5와 같이 결과값이 2개로 나오는 경우에는 무언가 이상한 값이 나오는 것을 볼 수 있었습니다. 그래서 어디가 문제인지 이것을 해결하기 위해서 다양한 것을 시도해야 했습니다.



일차적으로 해보기는 해보니, BCD가 먼저와서 2진수로 디바이스의 메모리상에 저장이 되어 있는 연산결과값을 4자리로 FND로 표현할 수 있도록 표현식을 변환해 줍니다. 그 다음에 DIS명령어를 사용해서 제대로 4자리수로 나뉘어져 있는 값을 한개씩 잘라 줍니다. 그리고 나서 SEG명령어로 세크먼트 디코더에 넣어서 각각의 램프에서 숫자표현이 가능하도록 만들어 줍니다.



마지막으로 완성된 모습입니다. 이제서야 제대로 마이너스의 연산값도 표시가 되는 것을 볼 수 있었습니다. 지금은 비록 계산기에 불과한 지는 모르겠습니다만, 그래도 나중에 가면, 센서에서 측정된 값을 바탕으로 다양한 제어가 가능하리라 생각이 듭니다.

+ Recent posts

티스토리 툴바