본문 바로가기
PLC 프로그래밍/MELSEC PLC

MX-Link 사용하기 [2]

by lemy 2019. 3. 25.
반응형



MX-Link 사용하기 [2]


출처: melsec PLC 동호회(http://cafe.daum.net/melsec)의 회색늑대 (grizlupo)님의 "MX-Link 사용하기" 연재글 입니다. 

회색늑대 (grizlupo)님의 통신 이야기중 MX-Link에 관련하여 전반적으로 이해 할 수 있는 좋은 글입니다. 총 3회 분량의 글 입니다.


이제 실제로 프로그램을 해 보겠습니다. 프로그램을 하려면 아무래도 관련 툴이 있어야 하 는데 비주얼 C/C++이나 비주얼 베이직 아니면 아주 통째로 비주얼 스튜디오가 있다면 좋겠 지만 아마도 그런 툴들이 없는 사람들이 더 많을 겁니다. 

그래서 엑셀에 포함된 VBA를 이용 하겠습니다. 흔히들 그냥 매크로 프로그램이라고 하는데 네! 그거 맞습니다.


일단 저는 엑셀을 이용하지만 워드여도 상관없고, 오토캐드 2002 이상 이여도 상관없습니다. 그냥 VBA만 있으면 됩니다.

일단 엑셀을 실행하시고, [도구 – 매크로 – Visual Basic Editor]을 실행 하세요. 엑셀에서 VBA를 전혀 해 보지 않은 분들을 위해 조금 자세하게 설명하겠습니다. 


화면을 열심으로 찾아보시면 이 비슷한 창을 찾으실 수 있을 겁니다. 통상 왼쪽 위에 있습 니다.

찾으셨으면 이 창에서 오른쪽 클릭을 하십시오.



그리고 [파일 가져오기] 선택하십시요.


이 작업은 MX-Link의 함수들을 매크로에서 사용할 수 있도록 하기 위한 것입니다. 통상적으 로는 C:₩MELSEC₩Common₩Include에 있는 MDFUNC.BAS 라는 파일을 선택하십시오. 그러면 다음 처럼 MMSCL32라는 모듈이 새롭게 만들어질 것입니다.



MMSCL32 라는 모듈을 열어보면 하시겠지만 사용할 수 있는 함수들이 선언되어 있고, 그기에 필요한 각종 선언들이 쭉 나열되어 있습니다. 굳이 C로 테스트를 하고 싶으신 분들은 같은 디렉토리에는 C에서 사용할 수 있는 헤드 파일 도 함께 포함되어 있습니다. 

그리고 C:₩MELSEC₩Common₩Lib 라는 디렉토리에는 mdFunc32.lib 라는 라이브러리가 포함되어 있으므로 링크할 때 함께 링크시키는 것 잊지 마십시오.


준비는 끝났습니다. 이제 프로그램을 하겠습니다. 프로그램은 ThisWorkbook 에 하겠습니다. ThisWorkbook이라는 부분을 더블클릭하십시오. 그러면 오른쪽으로 하얀 백지가 열릴 것입니 다. 그곳에 이제 프로그램을 채워 놓으시면 됩니다.

일단 매크로를 처음 사용하시는 분을 위해 간단하게 매크로가 어떻게 엑셀상에서 동작하는지 한번 해 보고 시작하겠습니다.


public sub test() 까지만 입력하고 엔터를 눌러 보십시오. 그러면 자동으로 다음처럼 될 겁니다.

테스트를 위한 것이니까 MX-Link와는 상관없이 다음과 같이 입력해 보십시요.



Public Sub test()

MsgBox "Test"

End Sub


입력하는 동안 뭔가 화면에서 나타났다가 사라지고 하더라도 꿋꿋하게 입력하십시오. 화면 에 어지럽게 나타나는 것도 아주 심오한 뜻이 있어 만들어진 고급 기능이니까요.


혹 베이직 문법 조차도 모르는 사람이라면 일단은 여기서 포기하십시오. 지금 제가 하려는 것은 프로그램에 대한 것입니다. 

아쉽지만 베이직 문법까지를 설명드릴 수는 없습니다. 단 지 베이직을 모르는 것뿐이다. C는 안다 그러면 계속 읽으세요. ^^; C를 아시는 분이라면 함수와 인수에 대한 설명만 있으면 될 테니까요. 그런 설명은 물론 베이직을 기준으로 설명 하겠지만 대충 알아서 사용하십시오.


다시 원래대로 돌아와서 위 프로그램을 실행시켜 보겠습니다. 이것은 어디까지나 엑셀의 매 크로가 낯선 분들을 위한 것입니다. 

하긴 그렇다 치더라도 좀 넋두리가 심하긴 심한 것 같 습니다.


실행은 두 가지 방법으로 할 수 있습니다. 그냥 Editor 상에서 그냥 실행이라는 메뉴를 선 택하는 하는 방법과 다시 엑셀로 나가서 매크로를 실행하는 과정대로 실행하는 방법입니다.


Editor 상에서 그냥 실행하는 방법은 마우스로 실행시키고 싶은 함수 이름 부분을 클릭해서 캐럿이 함수 내부에 위치하도록 한 상태에서 [실행] 메뉴를 선택하거나 F5 버튼을 누르거나 툴바에서 녹색 삼각형 모양(보통 카세트의 플레이 버튼에 그려진 것 같은)의 버튼을 누르십 시요. 그러면 실행되면서 화면에


이런 화면이 생길 겁니다. 프로그램이 그렇게 하라고 했으니깐요.


엑셀에서 매크로로 실행하려면 일단 엑셀의 [도구 – 매크로 – 매크로]를 선택하십시요. 그 러면 실행 가능한 매크로 목록을 보여 줍니다. 그 중에서 방금 만든 test를 선택하시면 됩 니다.


여기까지 조금은 쓸 데 없는 도입과정이었습니다. 이제 진짜로 MX-Link 프로그램을 하겠습 니다.

MX-Link를 사용하기 위해서 가장 먼저 해 주어야 하는 일은 mdOpen입니다.

이렇게 열린 것은 나중에 반드시 mdClose로 받아 주어야 합니다.


우리는 지난 번처럼 따로 PLC를 준비하지 않고, LLT를 사용할 것이기 때문에 이번에도 LLT 를 기준으로 설명하겠습니다. 나머지 연결들도 조금씩의 차이와 특성이 있기는 하지만 LLT 를 사용하는 것과 기본적인 절차는 동일하기 때문에 LLT로 MX-Link에 익숙해 지신다면 별 다른 문제는 없을 것입니다.


MMSCL32를 열어보시면 알겠지만 mdOpen은 세 개의 인수가 필요합니다.


ByVal Chan As Integer,

ByVal Mode As Integer,

Path As Long


이 중에서 우리가 능동적으로 부여하는 것은 Chan입니다. 물론 Channel을 말하는 것으로 지 난 번에 디바이스 모니터링 유틸리티에서 네트워크 세팅을 하면서 이미 봤습니다. 우리가 사용할 LLT는 1:LLT로 표시된 것처럼 채널이 1번입니다. 따라서 지금은 Chan에 1을 값을 주 고 mdOpen을 사용할 것입니다. 

Mode 는 현재로는 별다른 의미가 없는 값으로 0을 줍니다. 마지막 Path는 값을 주는 것이 아니라 연결이 되면 값이 기록됩니다.


정리하면 mdOpen이라는 함수는 채널을 주면 그것에 이러는 Path 즉, 경로를 준다는 것입니 다. 이후 모든 함수는 이 Path를 가지고 있어야만 사용이 가능합니다. 그러므로 싫던 좋던 무조건 우리가 사용해야 할 첫 함수는 mdOpen입니다.

일단 mdOpen만 들어 있는 프로그램을 하나 만들어서 조금 더 MX-Link를 사용한다는 느낌을 가져보겠습니다.


Public Sub test()

Dim result As Integer

Dim Path As Long

result = mdOpen(1, 0, Path)

End Sub


아마도 프로그램은 골백번을 실행해도 별 다른 변화가 없을 겁니다. 바꿔 말하면 아무런 에 러도 없이 실행되니까 일단은 성공한 것입니다. ^^;


MX-Link의 모든 함수들은 위에서 보인 것처럼 Integer의 결과를 돌려 줍니다. 이 값이 0이 면 함수가 정상적으로 실행되었다는 것이고, 0 이외이면 제대로 실행되지 않았다는 것이고, 그 값이 구체적으로 어떤 문제가 있는지를 표시하는 에러 코드이기도 합니다. 그렇다면 이 제 mdOpen이 제대로 실행되었는지를 확인하는 코드를 함께 넣겠습니다.


Public Sub test()

Dim result As Integer

Dim Path As Long


result = mdOpen(1, 0, Path)


If result <> 0 Then

MsgBox "mdOpen 실패!" + Str(result)

End If

End Sub


이제 다시 실행해 보십시오. 흑! 그런데 좀 전의 장담과는 달리 66번 에러가 발생합니다. 

이게 무슨 에러지 에로코드를 확인해 보면 이미 열린 채널을 또 열었다는 것입니다. 즉, 채널에 대해서는 한번만 열기하면 된다는 것입니다. 정리하면 한 번만 열든가 닫았다가 다시 열든가 그렇게 하라는 것입니다. 하지만 이 에러를 내더라도 실제로 사용하는 데는 아무런 지장이 없습니다. 즉, 이 것은 에러로 분류되어 있지만 에러라기 보다는 그냥 단순한 통보에 지나지 않습니다.


그렇더라도 열었으면 닫고, 닫고 난 다음에 다시 여는 것이 다른 프로그램 방법일 것입니다. 그래서 프로그램에 mdClose를 추가 시켰습니다. 그리고 66번 에러는 그냥 무시하도록 했습니다. 이미 열렸다는 것은 열려 있으니 사용해도 된다고 해석해도 됩니다. 

적어도 현재 까지는요 ^^;

mdClose는 mdOpen이 돌려준 path 값을 필요로 합니다.


Public Sub test()

Dim result As Integer

Dim path As Long


result = mdOpen(1, 0, path)

If result <> 0 Then

MsgBox "mdOpen 실패!: " + Str(result)

If result <> 66 Then

Exit Sub

End If

End If


result = mdClose(path)

If result <> 0 Then

MsgBox "mdClose 실패!: " + Str(result)

End If

End Sub


프로그램을 이렇게 고친 후 실행시켜 보면 처음 한 번은 66번 에러가 발생하지만 그 이후 부터는 mdOpen에서 전혀 에러가 발생하지 않는다는 것을 알 수 있습니다.


이제 mdOpen으로 열렸으니 값을 읽고 써 보겠습니다. 이것이 우리가 최종적으로 원하는 것이고, 또 솔 직이 이게 MX-Link의 전부 이기도 합니다.


디바이스를 읽거나 쓰는데 관여하는 함수는 mdSend, mdReceive, mdDevSet, mdDevRst, mdRandR, mdRandW 이렇게 6가지 입니다.

이 중에서 일단 이 번에는 mdReceive만을 해 보겠습니다 PLC로부터 값을 읽어 오는 기능입 니다. MMSCL32을 보면 인수가 이것저것 많습니다.


ByVal path As Long,

ByVal Stno As Integer,

ByVal Devtyp As Integer,

ByVal devno As Integer,

size As Integer,

buf As Any


path는 물론 mdOpen에서 받은 값입니다. 두 말할 필요가 없을 것 같습니다.


Stno은 조금 긴 설명이 필요한 값인데 LLT에 있어서는 다른 값을 설정할 수 없기 때문에 간 단합니다. LLT에 있어서는 255를 사용해야 합니다.


다른 경우에는 Stno는 워드 값이기 때문에 두 개의 바이트가 있는데 이 중 상위 바이트는 네트워크 번호, 하위 바이트는 국번으로 사용됩니다. 즉, LLT를 제외한 다른 채널의 경우에 는 구체적인 PLC를 설정하는 용도로 사용됩니다. 대부분의 경우 이 값은 각각의 채널 유틸 리티들에서 설정한 Logical Station No을 설정합니다.


이 값을 제대로 이해하기 위해서 CPU COM Utility를 잠시 사용해 보겠습니다. 이것은 CPU의 다운로드 포트를 직접 사용하는 것으로 따라 장착된 시리얼 모듈과 구별됩니다. 시리얼 모 듈인 경우에는 Computer link Utility를 사용해야 합니다.


PC측이 어떤 포트를 사용하느냐에 따라 채널 번호가 다릅니다. 정확하게 선택하십시오. 화 면을 보면 Logican Station No. 라고 된 부분이 있는데 역시 철자가 틀린 것입니다. Logical이 맞을 겁니다. 체크 표시가 없는데 체크 표시를 하십시오. 그렇게 하고 Logical Station No.을 마음대로 설정하십시오. 그리고 그 논리국번이 물리적으로 어디에 연결되는 것인지를 아래 설정을 보시면서 하십시오. CPU COM에 대해서는 비교적 간단합니다. CPU의 Type만 선택해 주시면 됩니다.


이렇게 하면 구체적으로 네트워크 번호 와 국번으로 프로그램을 한 것보다 융통성이 있게 됩니다. 즉, 프로그램은 여전히 논리국번 0으로 연결되도록 되어 있기 때문에 향후에 연결 되는 PLC 종류가 바뀌더라도 이 유틸리티를 열어 논리국번 0에 해당하는 PLC의 타입만 바꿔 주면 기본의 프로그램은 수정할 필요가 없는 것입니다. 왜냐하면 그 프로그램은 논리국번 0 에 설정된 대로 연결을 하기 때문입니다.


다시 프로그램으로 돌아와서 이렇게 논리국번이 설정되었다면 네트워크 번호는 0으로 하고 국번 자리에 논리국번을 사용하시면 됩니다. 그렇지 않은 경우에는 구체적인 네트워크 번호 와 국번을 기술하시면 됩니다. 전 이렇게는 프로그램을 해 보지 않아서 정확하게 어떤 번호 를 어떻게 기술해야 하는지 잘 모릅니다. 굳이 유틸리티를 사용하고 싶지 않으신 분들은 이것저것 시도해 보십시요.

하지만 지금 우리는 LLT를 사용할 것이기 때문에 반드시 Stno 자리에 255를 사용해야 합니다.


Devtyp와 devno은 어떤 디바이스을 읽은 것인지를 전달하는 인수입니다. Devtyp은 MMSCL32 에 보시면 Dev로 시작하는 수많은 상수들이 선언되어 있는데 그걸 사용하시면 됩니다. 

가령 D 디바이스인 경우 DevD로 13입니다. 그리고 devno은 디바이스의 번지로 10진수로 표현하는 디바이스든 16진수로 표현하든 디바이스든 상관없이 그냥 숫자로 표현하면 됩니다. 

10 진수로 표현하는 D100 같은 경우에는 DevD, 100 이렇게 하시면 되고, 16진수로 표현되는 W100 같은 경우에는 DevW, 256이라고 하든가 일일이 십진수로 바꾸어 표현하기 귀찮으니까 베이직의 16진 표현법인 DevW, H&100 이렇게 표현하시면 됩니다. 실제로 이 부분이 편리한 면도 있지만 익숙하지 않은 분들은 많이 짜증스럽습니다. 

그런 사람들의 의견이 반영된 것 인지 MX-Component는 우리가 통상적으로 사용하는 표현을 그대로 사용합니다. "M100"이런 식으로 디바이스를 문자열로 표현합니다. 이런 점만 해도 솔찍이 MX-Component가 편리합니다. 조금 큰 것이 흠이지만요. 그리고 COM 형태이기 때문에 아무래도 MX-Link 보다는 느립 니다. 


다음으로 주어야 하는 값은 size 와 buf 입니다. 즉, Devtyp, devno에서 시작해서 얼마만큼 의 디바이스를 읽은 것인지를 size에 적어줍니다. 이 때 size는 바이트 단위 입니다. 즉, D 워드 디바이스 하나를 읽는 다면 2라고 하셔야 합니다. 물론 10개를 읽는다면 20을 하셔야 합니다. 크기의 제한이 있습니다. 지금 정확하게 얼마 정도인지 확인이 안되지만 아무튼 크 기 제한이 있습니다. 무한정 크게 하지 마십시오. 그리고 buf는 읽혀질 값을 저장할 공간입 니다. 배열로 하시면 됩니다.


Public Sub test()

Dim result As Integer

Dim path As Long


result = mdOpen(1, 0, path)

If result <> 0 Then

MsgBox "mdOpen 실패!: " + Str(result)

If result <> 66 Then

Exit Sub

End If

End If


Dim buf(0 To 9) As Integer

result = mdReceive(path, 255, DevD, 0, 10 * 2, buf(0))

If result <> 0 Then

MsgBox "mdReceive 실패!: " + Str(result)

End If


result = mdClose(path)

If result <> 0 Then

MsgBox "mdClose 실패!: " + Str(result)

End If

End Sub


실행하셔도 별다른 변화를 느끼실 수 없을 겁니다. 하지만 LLT를 실행시켜 두었다면 buf에 D0부터 D9가지의 값이 읽혀지게 됩니다. 

굳이 확인하고 싶으시면 mdReceive 후단에서 브레 이크를 걸어 값을 모니터링 해 보십시오. 제대로 읽혔음을 확인하실 수 있을 것입니다. 물론 미리 적당하게 구별이 가능한 값을 D 디바이스에 기록해 두어야겠죠 모두 0이라면 읽혔는지 안 읽혔는지 알 수가 없잖아요.



반응형

'PLC 프로그래밍 > MELSEC PLC ' 카테고리의 다른 글

Q_CPU, GOT_T/Screen RS-232C 포트 Cable 배선도  (0) 2019.03.28
MX-Link 사용하기 [3]  (0) 2019.03.25
MX-Link 사용하기 [1]  (0) 2019.03.24
시리얼 통신 하기[7]  (0) 2019.03.09
시리얼 통신 하기[6]  (0) 2019.03.08

댓글