RS232C-I/O通信制御(PIC16F648A)   HOMEへ

☆はじめに

☆準備

☆仕様・製作

◎RS232C-I/O通信制御ボードハード(PIC16F648A使用)

◎RS232C-I/O通信制御ボードソフト(PIC16F648A使用)

◎RS232C-I/O通信制御ソフト(パソコン用)

◎RS232C-I/O通信制御(VB2005) 簡易プログラム制御画面説明

◎RS232C-I/O通信制御  簡易プログラム制御 プログラム方法説明 (別ページ)

☆まとめ


☆はじめに

仕事で取扱っている計測機器のI/Oをパソコンより制御して自動で動かしたいと思い、汎用USB-IOのキットが有るのを知り、Km2Netさんから購入して、少し遊んでみまし た。

今回の仕様では、汎用USB-IOはIO点数が12点と少し不足気味で、、トランジスタやフォトカプラ等を追加しないとこれだけでは使用出来なく、別基板も製作する必要が有るので、勉強も兼ねてもう少し簡単な別の方法で考える事にしました。

最終的に、右の系統図のPICマイコンのIOピンをRS232Cで制御して、計測機器のI/Oを制御する事にしました。

下記の準備を経て、右図のRS232C-I/O通信制御ボードのハード及びソフトを製作しました。

又、パソコン側の通信制御ソフトは、各IOを個別で制御する手動制御と、使用する専用計測機器を任意に設定・自動で制御出来る自動制御の2つの制御モードを持ったソフトを作成しました。

VB、C言語等でプログラムソフトを作らなくても、命令を順に並べれば簡易的なプログラム機能でIOを制御出来るシーケンス制御機能も追加しました。

 

最近のパソコンはシリアルポート(RS232Cポート)が無い物が多くなっていますが、USB・シリアル変換ケーブルを使用すれば、USBポートに接続して制御することが出来ます。私は、秋月電子通商製(安価なので)のUSB・シリアル変換ケーブルを使用して、通信制御のテストをしています。シリアルポートはPICライターに使用。(ケーブルを差換えるのが面倒なので)

 

  下記の写真が製作したボードとソフトです。

汎用USB-IO (ヘッダは別途取付けました)  

系統図

 

     RS232C-I/O通信制御ボード               

 

 

 

 

 

 

 

 

  RS232C-I/O通信制御(手動制御)

 

 

 

 

 

 

 

 

 

  RS232C-I/O通信制御(自動制御)

上記のパソコン側の通信制御ソフトは計測機器専用ソフトの為、一般でも使用出来るように汎用的ソフトに修正しました。自動制御モードは無くし、簡単なプログラム設定でIOを自動で制御出来る簡易プログラム制御機能を少しアップ修正しました。(但し、簡単、単純な制御しか出来ませんが!)

 

このページのTOPへ

 


 


☆準備

PICは勿論マイコンに関してもほとんど初めてみたいなものですが、PICに関しては情報が豊富に有り、素人の私で出来る物が有るかをインターネット上で色々と調べたら、BASICでプログラムを作成出来るPICコンパイラーが有る事を知り、又、PICにソフトを書込むPICライターも、ハード、ソフト共フリーの物が色々と紹介されているので、価格も安く出来るので、PICで作ってみる事にしました。(コンパイラーは、容量に制限が有るが、フリーで使用可能なmikroElektronikaさんのmikroBasicを使用。mikroBasicを使用したプログラムの作成方法等の載ったホームページは余り有りませんが、PICを始めようさんのホームページには詳しく解説してあり、ここで使い方他を学びました。)

PICライターは、JDMライターで、マルキン’ず工房さんのホームページに載っている回路図のPICライターを自作する為の部品とPICを購入する為、部品屋に行きました。PICライター用部品を購入した後、PICを購入しようと別の店で、PICの隣にPICライターキットのJMDライターが800円位で安く売っていました。価格も安く、作るのも面倒なので、正常に書込み出来るかどうかは判らないが取り敢えず購入してみました。(このライターでかなりてこずりました。)

PICは、使用例が多いPIC16F84A、PIC12F675、PIC16F648Aの3種類購入してみました。

購入したPICライターで、書き込みソフト”IC-Prog”を使用して書込みしてみましたが、書込む事が出来ません。基板に付いているLEDも取外しても、ツェナダイオードも変えても書込めません。使用したRS232Cのケーブルが2m以上と長いので電圧が落ちてしまい駄目なのかと思い、短いケーブル(50cm位)を作って書込んだら書込む事が出来ました。

PIC12F675でソフトの書込み出来ましたが、再度書込みしたら書込む事が出来ません。PICが悪いのかと思い、他のPIC12F675で書込んでも同じ現象です。PIC16F648Aでは正常に再書込み出来ました。ネットで調べてみると、PIC12F675は、内部クロックを使用したソフトを書込むと、再度書込みする時に、先にプログラム動作してしまうので、書込む事が出来なくなってしまう事が判りました。内部クロックを使用したソフトを一度書込んだPIC12F675には、遅延させる回路が無いこのPICライターでは再書込み出来ません。取り敢えずPIC12F675は、外部クロックを使用してテスト学習して、PIC16F648Aで内部クロックを使用する事にしました。

暫く使用してみると、このPICライター、状況により書込みに失敗する時も有り、非常に不安定です。

拠って、PIC12F675の再書込みも可能な当初の計画したマルキン’ず工房さんのPICライターを、結局後日自作する事になりました。

        

    市販PICライターキット          

マルキン’ず工房さんの回路図の自作PICライター

(ICソケットは共用は止めて、単独で付けました。LEDも2個しか付けませんでした。) 

老眼で目も見えにくくなってきて、ハンダ付けも減らしたいので、簡単にテスト実験出来るように、電子工作定番のブレッドボードを私も購入しました。

 

PICのmikroBasicのプログラムで、てこずったのは、コンフィグの正しい設定(特にMCLR(リセットピン)を使用しないを設定していなくて、実行時に不安定となって、ブレットボードや配線等の接触不良やノイズの影響を疑ってしまいトラブリました。)、USART機能の有るPIC16F648AのRS232C設定時の設定個所が判らず迷いましたが、趣味の電子回路工作さんのホームページに非同期通信(TXSTA、RCSTAレジスタ他の設定)の解説が有り、これを参照して設定したら通信をする事が出来ました。

mikroBasicのソフト及びマニアルにはライブラリが多く有り、プログラム部分は参考になりました。

 

今回のRS232C-I/O通信制御ボードに使用するPICは、18ピンのPIC16F648Aで、内部の 4MHzRC発振器を使用すれば、外部クロックの時と比べて2ピン余り、PIC16F84Aより、IOピンが2ピン多くなり、USART機能も有り、価格もPIC16F648Aの方が安価なので、これを使用する事にしました。

 

このページのTOPへ

 


 


☆仕様・製作

◎RS232C-I/O通信制御ボードハード(PIC16F648A使用)

RS232C-I/O通信制御ボード(PIC16F648A)回路図

PIC16F648Aを使用して、クロックは内部の 4MHzRC発振器信号を使用します。18ピンの内、VDD、VSS電源で2ピン、RS232C用で2ピン使用して、残り14ピンをI/Oピンとして使用しました。RA0〜RA5ポートの6ポートを入力用、RA6、RA7、RB0、RB3〜RB7ポートの8ポートを出力用とします。RS232Cレベル変換器(MAX232)を使用して、パソコンとRS232C通信でI/Oをコントロールします。入力はフォトカプラ入力、出力はオープンコレクタ出力です。RS232Cの通信速度は、9600bps固定です。今回は、RS232C-I/O通信制御ボード電源及び入出力電源は、制御する計測機器にDC24V電源が有り、それを使用する事が出来たので、計測機器より供給するので、通信制御ボードには、電源は持っていません。通信制御ボードの入出力用コネクタにピンヘッダを使用しましたが、基板の方にソケットを付けた為、ケーブル側がピンヘッダとなりハンダ熱でピンの固定が緩んでしまい、瞬間接着材で固定して何とか固定が出来ましたが、失敗でした。逆にすべきでした。

計測機器と接続するにあたり、通信制御ボードをプラスチックのボックスに入れました。

 

 

このページのTOPへ

 


 

◎RS232C-I/O通信制御ボードソフト(PIC16F648A使用)

RS232C-I/O通信制御ボード(PIC16F648A)ソースリスト(asm)  アセンブルリスト

RS232C-I/O通信制御ボード(PIC16F648A)ソースリスト(pbas)  mikroBasicリスト (lzhで圧縮)

RS232C-I/O通信制御ボード(PIC16F648A)HEXファイル 

 

               RS232-I/O通信制御ボード  I/O割付&制御コマンド

                   PIC16F648A  I/Oピン

IN (I/O通信制御ボード ← 制御機器)

制御コマンド OFF 制御コマンド ON
RA0 z (0x7A) LO Z (0x5A) HI
RA1 y (0x79) LO Y (0x59) HI
RA2 x (0x78) LO X (0x58) HI
RA3 w (0x77) LO W (0x57) HI
RA4 v (0x76) LO V (0x56) HI
RA5 u (0x75) LO U (0x55) HI

OUT (I/O通信制御ボード → 制御機器)

制御コマンド OFF 制御コマンド ON
RA6 a (0x61) LO A (0x41) HI
RA7 b (0x62) LO B (0x42) HI
RB0 c (0x63) LO C (0x43) HI
RB3 d (0x64) LO D (0x44) HI
RB4 e (0x65) LO E (0x45) HI
RB5 f (0x66) LO F (0x46) HI
RB6 g (0x67) LO G (0x47) HI
RB7 h (0x68) LO H (0x48) HI
ALL(全OUTポート) i (0x69) LO I (0x49) HI
Aポートの状態取得制御コマンド S (0x53)
Aポートの状態取得応答コマンド 2**0〜2255(10進数) (*はスペース)
Bポートの状態取得制御コマンド s (0x73)
Aポートの状態取得応答コマンド 3**0〜3255(10進数) (*はスペース)

 

RS232-I/O通信制御 ボードとパソコン間で通信するコマンドは、上記の表のコマンドで簡単な1文字通信です。

OUT命令は、パソコンからRA6〜RB7ポートまでの8ポート及び全てのOUTポートを制御するA〜Iまでの各ポートに対応したアルファベット1文字をパソコンより送信する事により、RS232-I/O通信制御 ボードの各OUTポートを制御して、RS232-I/O通信制御 ボードが受信したかを確認する為に、同じコマンドをパソコン側に送信します。

IN命令は、RS232-I/O通信制御 ボードの各INポートがLO、HIと変化した時点で、逐次変化した状態のコマンドをパソコン側に送信します。

IN、OUT命令共、アルファベット大文字はON(HI)命令、アルファベット小文字はOFF(LO)命令です。

Aポート及びBポートのLO、HIの状態を取得する為、コマンドを送信する事により、0〜7までの8ビットの状態を10進数でパソコン側に送信します。応答コマンドの先頭の2又は3は、Aポート、Bポートを区別する識別文字です。2文字以降の0〜255は、ポート8ビットのHI、LOの状態を表します。(今回ホームページに載せるパソコンソフトの機能アップの為、ポートの状態取得命令を追加しました。)

以上の制御が出来るPICのソフトをmikroBasicで作成しました。

 

mikroBasicで日本語のコメントが使用出来るように設定するには、

メニューバーの[Tools]の[Preferences]をクリック。 [Open option dialog...]ボタンをクリック。 [Display]ページに[Font]ボタンが2つ有り、両方を日本語に設定します。 [Font]ボタンを押して、フォント名及び書体の種類を日本語に変更すると日本語が可能です。 下にある方の[Font]ボタンがエディタの設定です。

 

以下がmikroBasicで作成したPIC側のプログラムソフトです。

program RS232CIO
' (OSC INT 4MHz, WDT_OFF,BODEN_ON,PWRTE_ON,INTRC_OSC_NOCLKOUT,MCLRE_OFF,LVP_OFF,BOREN_OFF)
'コンフィグ等の設定の記録(設定条件を忘れてしまうので記録しておく)
' RS232C-IO Communication control            'タイトル
' Ver 1.0  2006/08/14                       'バージョンa@ 作成月日

dim rcvByte as byte                    '受信データ(パソコンよりの制御命令)
dim potA0 as byte                      '入力ポートRA0が、ON(1)かOFF(0)かを記憶する変数
dim potA1 as byte                      '入力ポートRA1が、ON(1)かOFF(0)かを記憶する変数
dim potA2 as byte                      '入力ポートRA2が、ON(1)かOFF(0)かを記憶する変数
dim potA3 as byte                      '入力ポートRA3が、ON(1)かOFF(0)かを記憶する変数
dim potA4 as byte                      '入力ポートRA4が、ON(1)かOFF(0)かを記憶する変数
dim potA5 as byte                      '入力ポートRA5が、ON(1)かOFF(0)かを記憶する変数
dim potA6 as byte                      '出力ポートRA6が、ON(1)かOFF(0)かを記憶する変数
dim potA7 as byte                      '出力ポートRA7が、ON(1)かOFF(0)かを記憶する変数
dim inpot as byte                      '入力、出力ポートの8ポートがONかOFFかの状態を記憶する変数(0〜255、10進数)
dim txt as string[4]                   'inpotをstringに変換した文字列を入れる配列

'起動時にタイトル他を送信する為に、準備する
const msg1 as char[36] = "************************************"  'タイトルの枠
const msg2 as char[36] = "* RS232C-I/O Communication control *"  'タイトル
const msg3 as char[36] = "* Ver 1.0   2006/08/14  FUMATSUDOU *"  'バージョンaA作成日、作成者

'main procedure      
main:
'Place program code here
CMCON = %00000111                'コンパレータは使用しない設定            
PCON = %00001000                 '内部の 4MHzRC発振器使用設定
TRISA = %00111111                'RA0-RA5 はIN出力, RA6,7 はOUT出力設定
TRISB = %00000000                'RB0,3,4,5,6,7 はOUT出力 (RB1,2は RS232C使用)設定
SPBRG = 25                       '高速指定時の非同期通信速度 ( BRGH = 1 )でFosc=4MHz時の9600bpsのSPBRG(10進)は25に設定
RCSTA = %10010000                '受信制御レジスタの設定、7ピットを1(RB1およびRB2をシリアルポートにする)他の設定
TXSTA = %00100110                'TXSTA (送信制御レジスタの設定、5ビットを1(送信機能を使用する)、2ビットを1(高速)他の設定
Usart_Init(9600)                 'USARTモジュールの初期化
                                 'ポートの初期設定
PORTA = %00000000                'PORTRA を LOに設定
PORTB = %00000000                'PORTRB をLOに設定
Delay_ms(100)                    '100mS 待ち(遅延時間)
Usart_write(0x0d)                'CR(改行)を送信
Usart_Write_Text(msg1)           'タイトルの枠を送信
Usart_write(0x0d)                'CR(改行)を送信
Usart_Write_Text(msg2)           'タイトルを送信 
Usart_write(0x0d)                'CR(改行)を送信
Usart_Write_Text(msg3)           'バージョンaA作成日、作成者を送信  
Usart_write(0x0d)                'CR(改行)を送信
Usart_Write_Text(msg1)           'タイトルの枠を送信
Usart_write(0x0d)                'CR(改行)を送信
Delay_ms(100)                    '100mS 待ち(遅延時間)
Usart_write(0x4f)                'OKを送信
Usart_write(0x4b)
Usart_write(0x0d)                'CR(改行)を送信

potA0=0                          'ポートRA0の記憶変数を LO
potA1=0                          'ポートRA1の記憶変数を LO
potA2=0                          'ポートRA2の記憶変数を LO
potA3=0                          'ポートRA3の記憶変数を LO
potA4=0                          'ポートRA4の記憶変数を LO
potA5=0                          'ポートRA5の記憶変数を LO

while true                       'wendまでLOOPを繰り返す
    'OUT命令処理(パソコンより送信されたコマンドを受信)
    if Usart_Data_Ready = 1 then        '受信データが有った時      
      rcvByte = Usart_Read              '受信データを読取
      Usart_write(0x0d)                 'CR(改行)を送信
        select case rcvByte             '受信データを内容により振り分ける
            case "A"                    '受信データがAの時      
                PORTA.6 = 1             'ポートRA6をHIにセット
                Usart_Write(0x41)       '受信データと同じAを送信
            case "a"                    '受信データがaの時    
                PORTA.6 = 0             'ポートRA6をLOにセット
                Usart_Write(0x61)       '受信データと同じaを送信
            case "B"                    '受信データがBの時
                PORTA.7 = 1             'ポートRA7をHIにセット
                Usart_Write(0x42)       '受信データと同じBを送信
            case "b"                    '受信データがbの時
                PORTA.7 = 0             'ポートRA7をLOにセット
                Usart_Write(0x62)       '受信データと同じbを送信
            case "C"                    '受信データがCの時
                PORTB.0 = 1             'ポートRB0をHIにセット
                Usart_Write(0x43)       '受信データと同じCを送信
            case "c"                    '受信データがcの時
                PORTB.0 = 0             'ポートRB0をLOにセット
                Usart_Write(0x63)       '受信データと同じcを送信
            case "D"                    '受信データがDの時
                PORTB.3 = 1             'ポートRB3をHIにセット
                Usart_Write(0x44)       '受信データと同じDを送信
            case "d"                    '受信データがdの時
                PORTB.3 = 0             'ポートRB3をLOにセット
                Usart_Write(0x64)       '受信データと同じdを送信
            case "E"                    '受信データがEの時
                PORTB.4 = 1             'ポートRB4をHIにセット
                Usart_Write(0x45)       '受信データと同じEを送信
            case "e"                    '受信データがeの時
                PORTB.4 = 0             'ポートRB4をLOにセット
                Usart_Write(0x65)       '受信データと同じeを送信
            case "F"                    '受信データがFの時
                PORTB.5 = 1             'ポートRB5をHIにセット
                Usart_Write(0x46)       '受信データと同じFを送信
            case "f"                    '受信データがfの時
                PORTB.5 = 0             'ポートRB5をLOにセット
                Usart_Write(0x66)       '受信データと同じfを送信
            case "G"                    '受信データがGの時
                PORTB.6 = 1             'ポートRB6をHIにセット
                Usart_Write(0x47)       '受信データと同じGを送信
            case "g"                    '受信データがgの時
                PORTB.6 = 0             'ポートRB6をLOにセット
                Usart_Write(0x67)       '受信データと同じgを送信
            case "H"                    '受信データがHの時
                PORTB.7 = 1             'ポートRB7をHIにセット
                Usart_Write(0x48)       '受信データと同じHを送信
            case "h"                    '受信データがhの時
                PORTB.7 = 0             'ポートRB7をLOにセット
                Usart_Write(0x68)       '受信データと同じhを送信
            case "I"                    '受信データがIの時
                PORTA.6 = 1             '出力ポート全てをHIにセット
                PORTA.7 = 1
                PORTB.0 = 1
                PORTB.3 = 1
                PORTB.4 = 1
                PORTB.5 = 1
                PORTB.6 = 1
                PORTB.7 = 1
                Usart_Write(0x49)       '受信データと同じIを送信
            case "i"                    '受信データがiの時
                PORTA.6 = 0             '出力ポート全てをLOにセット
                PORTA.7 = 0
                PORTB.0 = 0
                PORTB.3 = 0
                PORTB.4 = 0
                PORTB.5 = 0
                PORTB.6 = 0
                PORTB.7 = 0
                Usart_Write(0x69)       '受信データと同じiを送信
            case "S"                    '受信データがSの時
                inpot=PORTA             'PORTAのポート状態を取得
                ByteToStr(inpot,txt)    'バイトを文字列に変換(portA)
                strAppendPre("2",txt)   'txtの前に2を追加
                Usart_Write_Text(txt)   '2を追加した文字列を送信
            case "s"                    '受信データがsの時
                inpot=PORTB             'PORTBのポート状態を取得
                ByteToStr(inpot,txt)    'バイトを文字列に変換(portB)
                strAppendPre("3",txt)   'txtの前に3を追加
                Usart_Write_Text(txt)   '3を追加した文字列を送信
        end select
            Usart_write(0x0d)           'CR(改行)を送信
    end if
     'IN命令処理(コマンドをパソコン側に送信)
    if PORTA.0 <> potA0 then            'ポートRA0がpotA0と同じでない時(入力が有った時)
        if PORTA.0 = 1 then             'ポートRA0が1の時
             Usart_write(0x5A)          'Zを送信
             potA0 = 1                  'potA0に1をセット
        else                            'ポートRA0が0の時                      
            Usart_write(0x7A)           'zを送信
            potA0 = 0                   'potA0に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
    if PORTA.1 <> potA1 then            'ポートRA1がpotA1と同じでない時(入力が有った時)
        if PORTA.1 = 1 then             'ポートRA1が1の時
            Usart_write(0x59)           'Yを送信
            potA1 = 1                   'potA1に1をセット
        else                            'ポートRA1が0の時 
            Usart_write(0x79)           'yを送信
            potA1 = 0                   'potA1に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
    if PORTA.2 <> potA2 then            'ポートRA2がpotA2と同じでない時(入力が有った時)
        if PORTA.2 = 1 then             'ポートRA2が1の時
            Usart_write(0x58)           'Xを送信
            potA2 = 1                   'potA2に1をセット
        else                            'ポートRA2が0の時 
            Usart_write(0x78)           'xを送信
            potA2 = 0                   'potA2に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
    if PORTA.3 <> potA3 then            'ポートRA3がpotA3と同じでない時(入力が有った時)
        if PORTA.3 = 1 then             'ポートRA3が1の時
            Usart_write(0x57)           'Wを送信
            potA3 = 1                   'potA3に1をセット
        else                            'ポートRA3が0の時 
            Usart_write(0x77)           'wを送信
            potA3 = 0                   'potA3に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
    if PORTA.4 <> potA4 then            'ポートRA4がpotA4と同じでない時(入力が有った時)
        if PORTA.4 = 1 then             'ポートRA4が1の時
            Usart_write(0x56)           'Vを送信
            potA4 = 1                   'potA4に1をセット
        else                            'ポートRA4が0の時 
            Usart_write(0x76)           'vを送信
            potA4 = 0                   'potA4に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
    if PORTA.5 <> potA5 then            'ポートRA5がpotA5と同じでない時(入力が有った時)
        if PORTA.5 = 1 then             'ポートRA5が1の時
            Usart_write(0x55)           'Uを送信
            potA5 = 1                   'potA5に1をセット
        else                            'ポートRA5が0の時
            Usart_write(0x75)           'uを送信
            potA5 = 0                   'potA5に0をセット
        end if
        Usart_write(0x0d)               'CR(改行)を送信
    end if
  wend                                  'trueの間、whileに戻りLOOPを繰返す
end.                                    '終了

上記のプログラムをmikroBasicで編集される場合は、ソースファイルのRS232CIO.pbasをダウンロードして下さい。(lzhで圧縮されています。)

New Projectの設定は、Project Name:任意の名前、Project Path:任意のフォルダ、Device:P16F648A、

Clock:004.000000で、コンフィグは、BODEN_ON、BOREN_OFF、CP_OFF、DATA_CP_OFF、PWRTE_ON、WDT_OFF、LVP_OFF、MCLRE_OFF、INTRC_OSC_NOCLKOUTにチェックを入れて下さい。(ここに写真があります

mikroBasicのインストール方法、使用方法については、PICを始めようさんのホームページを参照して下さい。

 

書き込みソフト”IC-Prog”を使用して、PICライターでPICに書込ます。IC-Progを起動して、ファイルを開くでRS232CIO.hex.txtを開きます。

設定は、デバイスはP16F648A、オッシレータはIntRC I/O、PWRTとBODENにチェックを入れます。(ここに写真があります

IC-Progの使用方法等は、シリアルポート接続PICライターの製作さんのホームページを参照して下さい。

 

 RS232-I/O通信制御ボード 通信テスト

 

 

RS232-I/O通信制御 ボードをハイパーターミナルで通信テストしてみました。

ハイパーターミナルを立ち上げ後、RS232-I/O通信制御 ボードの電源を入れると、通信制御 ボードからタイトル等(4行)が送信されます。OKが送信されて準備完了です。ポートA、BのIOポートは、LOにセットされています。

INポートRA0がHIとなったので、ボードよりZが送信されました。

INポートRA5がHIとなったので、ボードよりUが送信されました。

ハイパーターミナルよりOUT命令のAコマンドを送信したので、ボードよりAが返ってきました。

ハイパーターミナルよりOUT命令のFコマンドを送信したので、ボードよりFが返ってきました。

INポートRA0がLOとなったので、ボードよりzが送信されました。

ハイパーターミナルよりOUT命令のaコマンドを送信したので、ボードよりaが返ってきました。

ハイパーターミナルよりOUT命令のcコマンドを送信したので、ボードよりcが返ってきました。

ハイパーターミナルよりAポートの状態取得制御コマンドのSコマンドを送信したので、ボードより2 32が返ってきました。(Aポートの状態は、00100000(10進数で32) RA5ポートのみHIです。)

ハイパーターミナルよりBポートの状態取得制御コマンドのsコマンドを送信したので、ボードより3 34が返ってきました。(Bポートの状態は、00100010(10進数で34) RB1、RB5ポートがHIです。RB1はRS232Cポートで使用しているので、常にHIとなっています。)

INポートRA0がHIとなったので、ボードよりZが送信されました。

ハイパーターミナルよりAポートの状態取得制御コマンドのSコマンドを送信したので、ボードより2 33が返ってきました。(Aポートの状態は、00100001(10進数で33) RA0、RA5ポートがHIです。)

正常に通信出来ました。

 

 

このページのTOPへ

 


 

◎RS232C-I/O通信制御ソフト(Windowsパソコン用)

RS232C-I/O通信制御(Excel)    (lzhで圧縮) 

RS232C-I/O通信制御(VB2005) (lzhで圧縮)

Windowsパソコンより、RS232C-I/O通信制御ボードのIOを制御するWindowsパソコン用制御ソフトを、ExcelとVB 2005で作成しました。

 RS232C-I/O通信制御(Excel)

Excel VBAで作成しました。

Excel 2000以上でないと、動作出来ません。

出力のON、OFFのランプ表示は、コマンドを送信後、通信制御ボードより応答が帰ってきた事を確認して、ランプ表示をしています。

手動制御部分のみです。必要なら仕様を追加して下さい。

RS232C通信部分は、アクティブセルさんのEasyCommモジュールを使用しています。

 

アクティブセルさんのEasyCommを使ってRS232Cのデータを

Excelに取込むソフトを作成したのが、ソフトを作成する始めでした。

Excelでソフトを作成する事が出来る事を知りました。

このホームヘージには解説や作成例が多く、参考になり、VBAを覚える事が出来、ソフトを作成する事が出来るようになりました。

 

 

 

     RS232C-I/O通信制御(VB2005) 手動制御

 RS232C-I/O通信制御(VB2005) 簡易プログラム制御

 

VB.NET 2003には、SerialPort機能が無かったので、アクティブセルさんのEasyComm.NETモジュールを使用して、VB.NET 2003で前に作成したソフトを、VB 2005にSerialPort機能が付いたので、今回汎用的に修正、追加して、VB 2005で作り直してみました。

RS232C-I/O通信制御(VB2005).lzhを解凍してRS232C-I/O通信制御.exeを起動しても起動出来ない時は、Microsoft .NET Framework Version 2.0 再頒布可能パッケージとMicrosoft .NET Framework 2.0 日本語 Language PackをMicrosoftよりダウンロードしてインストールして下さい。

RS232C-I/O通信制御.exeを起動すると、同じ位置にIO-Communi-Cont-Set.xmlファイルが出来ますが、COMポートとタブページの設定内容を保存する保存ファイルです。削除しても良いですが、ファイルが無い時は、デフォルトで開きます。(COM1と手動制御画面)

IO手動制御の出力のON、OFFのランプ表示は、コマンドを送信後、通信制御ボードより応答が帰ってきた事を確認して、ランプ表示をしています。簡易プロブラム制御の方は、出力(OUT)は、送信のみで、応答の受信は確認していません。

 

 

このページのTOPへ

 


 

◎RS232C-I/O通信制御(VB2005) 簡易プログラム制御画面説明

 この簡易プログラム制御画面上で、命令を選択して制御プログラムを作成します。作成した制御プログラムは保存ボタンでテキストファイルに保存されます。保存したテキストファイルを読込ボタンで読込むことにより、再度使用及び編集が出来ます。

削除、挿入ボタンによる1行削除、1行挿入機能を付けて、編集機能をアップしました。

 

以下は、簡易プログラム制御画面のボタン操作及びプログラム命令の説明です。

 ・ボタン説明

運転ボタン:設定したCOMポートを開いて、RS232C-IO通信制御ボードと通信して、設定した簡易プログラム制御を実行します。

停止ボタン:設定した簡易プログラム制御の実行を停止して、開いたCOMポートを閉じます。

読込ボタン:保存された簡易プログラム制御ファイルを読込ます。

保存ボタン:設定した簡易プログラム制御プログラムをファイルに保存します。

ボタン:ステップb10ステップ加算して、設定を表示します。

▼ボタン:ステップb10ステップ減算して、設定を表示します。

削除ボタン:指定したステップbフ設定内容を削除して、指定したステップbフ次のステップhネ降の設定内容を1ステップ前に変更します。

GOTO及びIF INWaiteIF INStateのジャンプ先のステップbヘ、削除以降のステップbフ時は、自動的にスッテプb修正します。(1減算します。))

挿入ボタン:指定したステップbノ1行挿入して、指定したステップhネ降の設定内容を1ステップ後に変更します。

GOTO及びIF INWaiteIF INStateのジャンプ先のステップbヘ、指定したステップhネ降の時は、自動的にスッテプb修正します。(1加算します。))

全消去ボタン:設定値を全て消去して、設定値を初期状態とします。(全てEND

 

簡易プログラム制御設定

 ステップ数は、ステップ1〜ステップ990までです。

 

命令説明

END(終了命令):プログラムを終了します。

END の1つの命令のみです。

最初のEND命令の有るステップbナプログラムを終了します。

OUT(出力命令):指定した出力ポートをON又はOFFに制御して、次のステップbヨ進みます。

OUT(RA6)OUT(RB7)までの8つの出力ポートの内、指定した1つの出力ポートを、ON又はOFFして、次のステップbヨ進みます。

又、OUT(ALL)は、8つの出力ポートを全て、ON又はOFFして、次のステップbヨ進みます。

命令   IN/OUT   ON/OFF の3つの命令でセットとなります。

例、 OUT  OUT(RA6)  ON で、RA6ポートをONして、次のステップbヨ進みます。

IN(入力命令):指定した入力ポートが、ON又はOFFに変化するのを待ち、次のステップbヨ進みます。

IN(RA0)IN(RA5)までの6つの入力ポートの内、指定した1つの入力ポートがONからOFFに、又はOFFからONに変化するのを待ち、変化した時点で、次のステップbヨ進みます。

命令   IN/OUT   ON/OFF の3つの命令でセットとなります。

例、 IN  IN(RA0)  ON で、入力RA0ポートがOFFからONになるまで待ち、ONになった時点で、次のステップbノ進みます。(入力待ち状態となるので、指定した入力ポートの変化が有るまでプログラムは次のステップbヨ進めません。他の入力ポートが変化しても変化は有りません。)

TIMER(タイマー命令):遅延タイマーで、設定した時間の間、次のステップbヨ進むのを遅延します。(×10msタイマー)

命令  時間(×10ms) の2つの命令でセットとなります。

例、 TIMER  100 で、次のステップbヨ進むのを1000ms1秒)遅延します。(1000ms1秒)後に、次のステップbヨ進みます。)

GOTO(ジャンプ命令):指定したステップbヨジャンプして、ジャンプしたステップb謔閭vログラムを進めます。

命令  ステップa@の2つの命令でセットとなります。

例、 GOTO  120 で、ステップ120へジャンプして、ステップ120からプログラムを進めます。

IF INWaite(入力分岐命令):入力ポートが変化するのを待ち、指定した入力ポートがON又はOFFに変化した時は、指定したステップbヨジャンプします。

変化しなかった時は、次のステップbヨ進みます。

IN(RA0)IN(RA5)までの6つの入力ポートの内、1つでも変化するのを待ち、指定した入力ポートが、ONからOFFに、又はOFFからONに変化した時は、指定したステップbヨジャンプして、ジャンプ先のステップb謔閭vログラムを進めます。他の入力ポートが変化した時は次のステップbヨ進みます。

命令   IN/OUT   ON/OFF  ステップa@ の4つの命令でセットとなります。

例、 IF INWaite  IN(RA1)  OFF  80  で、入力ポートが変化するまで待ち、入力RA1ポートがONからOFFになれば、ステップ80にジャンプして、ステップ80からプログラムを進めます。又、入力RA1ポートに変化がなく、他の入力ポートが変化した時は、次のステップbヨ進みます。(入力待ち状態となるので、変化が有るまでプログラムは次のステップbヨ進めません。他の入力ポートも変化すれば、進みます。)

IF INState(入力分岐命令):入力ポートの状態を取得して、指定した入力ポートの状態がON又はOFFであれば、指定したステップbヨジャンプします。

指定した入力ポートが指定した状態でない時は、次のステップbヨ進みます。

命令   IN/OUT   ON/OFF  ステップa@ の4つの命令でセットとなります。

例、 IF INState  IN(RA2)  ON  200  で、入力ポートの状態を取得して、入力RA2ポートがONの状態の時は、ステップ200へジャンプして、ステップ200からプログラムを進めます。入力RA2ポートがOFFの状態の時は、次のステップbヨ進みます。(入力待ちは有りません。)

 

 


 

◎RS232C-I/O通信制御  簡易プログラム制御 プログラム方法説明 (別ページ)

簡易プログラム制御のプログラム動作を確認する為の入力用スイッチと出力用LEDを付けたRS232C-I/O通信制御ボードを作製して、

簡易プログラム制御のプログラム方法の説明を兼ねて、点滅するプログラムを3通り作成しました。

 

簡易プログラム制御 プログラム方法説明 (別ページ)   このページのTOPへ

 


 


☆まとめ

RS232C-I/O通信制御ボードのIOピンが、RB0ピン他の割り込み機能の有るピンを入力ピンに割り当てていなかったのを、私のPICの知識不足で後で気が付きました。拠って入力の割り込みは出来ません。(すみません! 次回製作する時が有れば変更してみます。)

簡易プログラム制御で、最小時間設定を10msとして有りますが、時間は余り正確ではないと思うので、当てにしないで下さい。計測機器専用ソフトは100msで作っていました。

RS232C-I/O通信制御ソフトをVB2005で作り直して、通信処理が少し早くなっている感じはしますが、計っていないので定かでは有りません。

簡易プログラム制御は、プログラムを作っていると、機能が少なくこんな機能を追加や修正も色々と出てきていますが、「簡易プログラム制御なので単純なプログラムしか作成出来ないソフト」と無理やり自分を納得させて、又、変更しているといつまでも終わらなくなってしまいますので、RS232C-I/O通信制御は、ここで完成とします。

初めてPICを使用しましたが、インターネット上には諸先輩方の情報が沢山有り、多くを参考にさせて頂きました。感謝致します。

 

HOMEへ    このページのTOPへ         PICミニミニ簡易プログラマブルコントローラ(PLC)ヘ

 


Counter