Go on PLCnext を使ってみる
このブログでは、PLCnext で Go を使用してアプリケーションを構築するための最初の手順について説明します。 Go に慣れていない人のために、参照 Web サイト www.golang.org を引用したいと思います
Go が好まれる特別な理由は、Web アプリケーションの作成が簡単でありながら静的バイナリにコンパイルできるため、プログラムを展開するために PLCnext コントローラーにパッケージをインストールする必要がないことです。
このブログでは、2 つの小さなプログラムを使用した PLCnext のコンパイルのみを扱います。コンパイルがうまくいくことを確認するための従来の HelloWorld プログラムと、Go の能力を示すための小さな REST API 呼び出し。このブログの作成で使用したもの:
- プログラムを作成するために VS an Go がインストールされた Ubuntu 18.04 LTS マシン
- バイナリをコントローラーに転送するための WinSCP
- プログラムを実行するパテ
それでは、HelloWorld アプリケーションから始めましょう。 HelloWorld.go という名前の新しいファイルを作成し、HelloWorld の例のコードをファイル内に貼り付けます。ファイルを保存して端末を開き、正しいディレクトリにいることを確認します。
以下のコマンドを使用して、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")
}
go
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} // Disable TLS check due to bad certificate
MakeRequest()
}
func MakeRequest() {
resp, err := http.Get("https://192.168.18.10/_pxc_api/api/variables?paths=Arp.Plc.Eclr/MainInstance.bInputs") // change to your IP adress and variables
if err != nil {
log.Fatalln(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
log.Println(string(body))
}
産業技術