概要
デバイスのメモリを一括コピーします。コピー元アドレスからワード数分のデータをコピー先アドレスにコピーします。アドレス数は1~640までです。
書式
memcpy (コピー先アドレス, コピー元アドレス, ワード数)
記述例
memcpy ([w:[PLC1]D0200], [w:[PLC1]D0100], 10)
上記の例は、D0100~D0109のデータがD0200~D0209にコピーされます。
コピー元データの読み出しは、必要時に一度だけ接続機器からデータ読み出しを行います。データ読み出し時に通信エラーとなった場合には、表示器内部の特殊リレーLS2032のビット12がONします。正常にデータ読み出しが終了した場合には、ビット12はOFFします。
コピー元データの読み出し、コピー先へのデータ書き込みは、コピー元データのアドレス数により一括または分割で行われます。コピー元データの読み出し中に通信エラーが発生した場合、コピー先へのデータ書き込み結果は一括/分割で以下のとおり異なります。(コピー先の書き込み結果 O:書き込み完了、X:いっさい書き込みされません)
アドレス数が多くなるにしたがって、それだけPLCへの書き込み時間が長くかかります。アドレス数によっては、数十秒、数分以上かかる場合があります。
書き込みにおいて、デバイスの範囲外になった場合は通信エラーとなり、電源のON/OFFをしないと復旧することはできませんのでご注意ください。
メモリコピー(memcpy)関数で内部デバイスに書き込むときは、ユーザーエリアのみ書き込めます。システムエリア(LS0000~LS0019)、特殊エリア(LS2032~LS2047)、予約エリア(LS2048~LS2095)は書き込むことができません。ただし、読み出すことは可能です。
Dスクリプトのビット長の設定が16ビットの場合、32ビットデバイス→16ビットデバイスにコピーしたときは、下位の16ビット分のデータのみがコピーされます。
例 : memcpy ([w:[PLC1]w30.0100], [w:[PLC1]BD0100], 3)
また、16ビットデバイス→32ビットデバイスにコピーしたときは下位の16ビットにデータをコピーし、上位16ビットは0がセットされます。
例 : memcpy ([w:[PLC1]BD0100], [w:[PLC1]w30.0100], 3)
Dスクリプトのビット長の設定が32ビットの場合、32ビットデバイス→16ビットデバイスにコピーしたとき、16ビットデバイス→32ビットデバイスにコピーしたときは以下のようになります。また、片方が32ビットデバイスで片方が16ビットデバイスの場合、memcpy()のアドレス数の指定は16ビットデバイス側のアドレス数で指定してください。
例 : memcpy ([w:[PLC1]w30.0100], [w:[PLC1]BD0100], 4)
例 : memcpy ([w:[PLC1]BD0100], [w:[PLC1]w30.0100], 4)
コピー元の範囲とコピー先の範囲が重なった場合、重なった部分のデータは以下のように書き替わります。
例 : D101~D104の4ワードをD100~D103にコピーする場合
コピー先への書き込みは、Oのアドレス(小さいアドレス)の方から行われます。
例 : D100~D103の4ワードをD101~D104にコピーする場合
コピー先への書き込みは、後アドレス(大きいアドレス)の方から行われます。
この関数ではアドレスを2つ指定していますが、Dスクリプトのアドレス数のカウントには加算されません。
代入にデバイスアドレスを使用する場合、接続機器との通信がありますので、すぐには書き込んだ値が代入されません。