PLCnext에서 Go 애플리케이션 빌드하기: 초보자 가이드
이 블로그는 PLCnext에서 Go로 애플리케이션을 빌드하는 첫 단계를 안내합니다. Go에 익숙하지 않은 분들을 위해 참조 웹사이트(www.golang.org)를 인용합니다.
Go를 좋아하는 특별한 이유는 웹 애플리케이션 생성이 쉽지만 정적 바이너리로 컴파일되기 때문에 PLCnext 컨트롤러에 프로그램을 배포하기 위해 패키지를 설치할 필요가 없다는 점입니다.
이 블로그에서는 PLCnext용 컴파일만 다루며 두 개의 작은 프로그램을 예로 듭니다. 컴파일이 잘 되는지 확인하기 위한 고전적인 Hello World 프로그램과 Go의 강력함을 보여주기 위한 작은 REST API 호출. 이 블로그 작성 시 사용한 환경:
- VS와 Go가 설치된 Ubuntu 18.04 LTS 머신(프로그램 생성용)
- WinSCP(바이너리 컨트롤러 전송용)
- Putty(프로그램 실행용)
자, Hello World 애플리케이션으로 시작해 봅시다. HelloWorld.go라는 새 파일을 만들고 Hello World 예제 코드를 붙여넣습니다. 파일을 저장하고 터미널을 열어 올바른 디렉토리에 있는지 확인하세요.
아래 명령으로 Go 코드를 빌드하고 실행합니다. 모든 것이 올바르게 설치됐다면 터미널에 Hello World가 표시됩니다. 애플리케이션을 아직 빌드 중일 때 이 명령을 사용할 수 있습니다.
go run HelloWorld.go
앞서 말했듯 정적 바이너리로 빌드하는 것도 가능합니다. 첫 번째 명령으로 빌드, 다음 명령으로 새로 생성된 바이너리 실행. 모든 게 잘 되면 터미널에 다시 Hello World가 표시됩니다.
go build HelloWorld.go
./HelloWorld
이 바이너리를 PLCnext 컨트롤러에서 실행하려 하면:
./HelloWorld: cannot execute binary file: Exec format error
Ubuntu 머신과 PLCnext의 아키텍처가 일치하지 않기 때문입니다. 다행히 PLCnext용으로 작동하는 바이너리를 만드는 건 꽤 쉽습니다(단, 이 새 바이너리는 Ubuntu 머신에서 실행되지 않습니다). 아래와 같이 빌드 환경을 설정하면 Go가 PLCnext용 바이너리를 생성합니다.
env GOOS=linux GOARCH=arm GOARM=7 go build
우리 예제에서는:
env GOOS=linux GOARCH=arm GOARM=7 go build HelloWorld.go
이 파일을 컨트롤러로 전송하고 실행하면 다시 Hello World가 뜨는 것을 볼 수 있습니다. 만약 그렇다면 축하합니다. PLCnext 컨트롤러용 첫 Go 프로그램을 작성했습니다! REST API 호출 예제를 보고 필요에 맞게 수정해 보세요!
이전 단계에 문제가 있나요?
chmod +x HelloWorld로 파일을 실행 가능하게 만들었나요?
Hello World 예제
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
REST API 호출 (HTTP GET)
package main
import (
"crypto/tls"
"io/ioutil"
"log"
"net/http"
)
func main() {
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} // 잘못된 인증서로 인한 TLS 체크 비활성화
MakeRequest()
}
func MakeRequest() {
resp, err := http.Get("https://192.168.18.10/_pxc_api/api/variables?paths=Arp.Plc.Eclr/MainInstance.bInputs") // 본인의 IP 주소와 변수로 변경
if err != nil {
log.Fatalln(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
log.Println(string(body))
}