PLC Concept (S7-1200)

พื้นฐานการทำงานของ PLC

ในแต่ละ scan cycle ของ PLC นั้นประกอบด้วยการเขียน outputs, อ่าน inputs, ทำงานตามโปรแกรมที่ได้เขียนไว้ และทำในส่วนของ system maintenance หรือ background processing

ภายใต้เงื่อนไขปกติ ทั้ง digital และ analog I/O จะถูก update ข้อมูลพร้อมๆกันในแต่ละ scan cycle โดยอาศัย internal memory ที่เรียกว่า process image  ดังนั้น process image จะประกอบด้วยการจับสัญญาณอย่างรวดเร็ว (snapshot) ของ inputs และ outputs จริงๆของ CPU, signal board และ signal module ต่างๆ

  • CPU จะทำการอ่าน inputs จริงๆ ก่อนที่จะทำการ execute user program และเก็บค่า input เหล่านี้ไว้ใน process image input area เพื่อให้มั่นใจได้ว่าค่าต่างๆเหล่านี้จะยังคงค่าเดิมตลอดการ execution ของ user instructions
  • CPU ทำงานตาม logic ที่เขียนไว้ใน user instructions และทำการ update ค่า output ใน process image output area แทนที่จะเขียนค่าลงไปที่ outputs จริงๆโดยตรง
  • หลังจากที่ทำคำสั่งต่างๆใน user program แล้ว CPU จะทำการเขียนค่า output จาก process image output area ไปยัง outputs จริงๆ

Warm restart : จะทำการ initialize all non-retentive system และ user data แต่ไม่ได้รวมถึงการทำ memory reset

Memory reset : คือการทำ clear all work memory, clear retentive & non-retentive memory area, copy load memory to work memory และ set output ให้เป็นสถานะที่ตั้งไว้ที่ “Reaction to CPU STOP” (Properties -> General -> Digital outputs)

Execution of the user program

OBs : (Organization Blocks)  เอาไว้ใช้สำหรับเขียนโปรแกรม  OB บางตัวเอาไว้ใช้ในหน้าที่พิเศษตาม event ต่างๆ เช่น interrupt เป็นต้น  แต่เราก็สามารถสร้าง OB สำหรับ custom event ได้เช่นกัน

OB ไม่สามารถเรียกใช้ OB กันเองได้ และไม่สามารถถูกเรียกโดย FC หรือ FB ได้  เฉพาะ event เท่านั้นที่สามารถเรียกใช้ OB ได้ เช่น diagnostic interrupt หรือ time interval

CPU จะเรียกใช้ OB ตาม priority class โดย priority OB ที่สูงกว่าจะเรียกใช้ก่อนตัวที่ priority ต่ำกว่า โดย priority class ที่ต่ำที่สุดคือ 1 (ถูกใช้กับ main program cycle) และสูงสุดคือ class 26 (สำหรับ firmware V4.0 เป็นต้นไป เราสามารถเปลี่ยน priority class ในแต่ละ OB ได้โดยไปตั้งใน attributes ของ OB properties)

เนื่องจาก CPU processing จะทำงานตาม event โดยในแต่ละ event จะไปทำการ trig เพื่อให้ interrupt OB แต่ละตัวทำงาน เราสามารถระบุ interrupt OB จาก event โดยการสร้าง block หรือตอนทำ device configuration หรือด้วย ATTACH / DETACH instruction

FCs & FBs (Functions & Function Blocks) : ประกอบด้วย program code อยู่ภายใน การใช้งาน FB จะไป link กับ Data Block (เรียกว่า Instance DB) ด้วยเพื่อที่จะใช้ Data Block ในการรักษาค่า state ต่างๆเอาไว้ระหว่างการทำงาน

Data Blocks : เป็นตัวเก็บข้อมูล และสามารถถูกใช้โดย program block ได้

Memory Area

Load Memory:  เป็น non-volatile storage ที่ใช้สำหรับ user program, data และ configuration เมื่อมีการ download project ลง CPU (FC,FB, OB, DB, Hardware configuration, Technology objects) มันจะทำการโหลดลง Load Memory เป็นอันดับแรก โดยพื้นที่นี้มีทั้งใน memory card (ถ้ามี) หรือใน CPU  เนื่องจากเป็น non-volatile memory area จึงทำให้ไม่สูญหายแม้ไม่มีการจ่ายไฟให้มัน  เราสามารถเพิ่มพื้นที่ของ Load Memory ในการทำ data log ด้วยการติดตั้ง memory card เพิ่มได้ด้วย

Work Memory : เป็น volatile storage สำหรับบางค่าเมื่อมีการทำงาน user program (Code work memory: FC, FB, OB  — Data work memory: Global DB, Instance DB, Technology objects) CPU จะทำการ copy ค่าเหล่านี้จาก Load Memory ไปยัง Work Memory  เนื่องจากเป็น volatile area จึงทำให้ไม่สามารถจดจำค่าได้เมื่อไฟดับ

Retentive Memory: เป็น non-volatile storage ที่อยู่ในส่วนหนึ่งของ Work Memory โดยจะใช้เพื่อเก็บค่าของ user memory เอาไว้ไม่ให้หายเมื่อไฟดับ (Global DB, Instance DB, Technology objects, bit memories, timers, counters) โดย CPU จะทำการคืนค่าให้ retentive value อีกครั้งเมื่อมีการจ่ายไฟมาใหม่

การใช้ SIMATIC memory card ก็เป็นอีกทางเลือกหนึ่งเพื่อเก็บ user program หรือใช้เพื่อ transfer program  เมื่อไรก็ตามที่เราใช้ memory card ตัว CPU จะรันโปรแกรมผ่านทาง memory card แทน memory ของ CPU (อย่าลืมตรวจสอบว่า memory card ไม่ได้อยู่ในโหมด write-protected ด้วย)

โดยการใช้ SIMATIC memory card สามารถใช้   เพื่อเป็น program card, เพื่อเป็น transfer card, เพื่อเป็น data collect file หรือเพื่อ update firmware ดังนี้

  • ใช้เป็น transfer program เพื่อ copy project ของเราไปยัง CPU หลายๆตัวโดยไม่ต้องใช้ software STEP7  โดย transfer card จะ copy project จาก card ลง memory CPU  และเราต้องเอา card ออกหลังจาก copy program ลง CPU แล้วด้วย
  • ใช้เป็น program card เพื่อแทน CPU memory โดย CPU function ทั้งหมดจะถูกควบคุมผ่านทาง program card แทน โดยการใส่ program card เข้าไปนั้นจะส่งผลให้ internal load memory ของ CPU ทั้งหมดถูกลบไป (รวมถึง user program และ forced I/O)  นั่นคือ CPU สั่งงาน user program ผ่านทาง program card แทน
  • ใช้เพื่อเก็บ data log file เพราะ program card มีพื้นที่มากกว่าพื้นที่ของ CPU มาก และเราสามารถใช้ฟังก์ชั่น Web Server เพื่อทำการโหลด data log file มายังคอมพิวเตอร์ของเราได้เลยโดยไม่ต้องถอด card ออกมา
  • และเรายังสามารถใช้ memory card เพื่อทำ firmware update ได้ด้วย
  • สิ่งสำคัญที่ควรระวังคือ แม้ว่า memory card ของทาง Siemens นี้จะมีรูปร่างเหมือนกับ SD card ทั่วๆไป แต่เราไม่สามารถนำ SD Card ทั่วๆไปมาใช้แทนได้  จำเป็นต้องใช้ memory card ของ Siemens เท่านั้น  และไม่ควรทำการ format memory card นี้ด้วย computer เพราะข้อมูลภายในถูกจัดเรียงมาให้เป็นรูปแบบเฉพาะ การ format อาจทำให้ไม่สามารถใช้ card นี้กับ PLC ได้อีกเลย

Data Type

  • Bool คือข้อมูลแบบ bit
  • Byte คือข้อมูลแบบ 8 bit
  • Word คือข้อมูลแบบ 16 bit
  • DWord คือข้อมูลแบบ 32 bit (double word)
  • Integer
    • Short Integer
      • USInt (unsigned 8-bit integer)
      • SInt (signed 8-bit integer)
    • Integer
      • UInt (unsigned 16-bit integer)
      • Int (signed 16-bit integer)
    • Double Integer
      • UDInt (unsigned 32-bit integer)
      • DInt (signed 32-bit integer)
  • Real
    • Real คือข้อมูล 32-bit Real number หรือ Floating-point value
    • LReal คือข้อมูล 64-bit Real number หรือ Floating-point value
  • Date and Time
    • Date คือข้อมูล 16-bit data (คล้ายกับ UInt) ที่มีข้อมูลจำนวนของวัน ตั้งแต่วันที่ January 1, 1990 โดยข้อมูลที่มากที่สุดคือ 65378 (16#FF62) ซึ่งก็คือ December 31, 2168
    • DTL (date and time long) คือข้อมูลจำนวน 12 bytes ที่เป็นข้อมูลของวันที่และเวลา เก็บในรูปของ predefined structure
      • Year (UInt): 1970 to 2554
      • Month (USInt): 1 to 12
      • Day (USInt): 1 to 31
      • Weekday (USInt): 1 (Sunday) to 7 (Saturday)
      • Hours (USInt): 0 to 23
      • Minutes (USInt): 0 to 59
      • Seconds (USInt): 0 to 59
      • Nanoseconds (UDInt): 0 to 999,999,999
    • Time คือข้อมูล 32-bit IEC time value (คล้ายกับ DInt) ที่เก็บจำนวนของ milliseconds จาก 0 ถึง 24วัน 20ชั่วโมง 31นาที 23วินาที 647มิลลิวินาที)  ข้อมูล Time Value นี้สามารถนำไปใช้คำนวณได้และสามารถเป็นค่าลบได้ด้วย
    • TOD (time of day) คือข้อมูล 32-bit time of day  (คล้ายกับ DInt) มีที่จำนวนของ milliseconds ตั้งแต่เที่ยงคืนเป็นต้นไป (0 ถึง 86,399,999)
  • Character and String
    • Char คือ 8-bit single character
    • String คือ ข้อมูลตัวอักษรที่แปรผันความยาวได้ถึง 254 ตัวอักษร
  • Array and Structure
    • Array คือกลุ่มของข้อมูลชนิดเดียวกันหลายๆตัว โดย array สามารถสร้างใน block interface editor สำหรับ OB, FC, FB และ DB  เราไม่สามารถสร้าง array ใน PLC tag ได้
    • Struct คือกลุ่มของข้อมูลหลายๆชนิดที่เอามารวมกลุ่มกัน ดังนั้นเราจึงใช้ Struct data type เพื่อจัดการกับกลุ่มของข้อมูลเสมือนเป็น single data unit ได้  เราต้องทำการ declare ชื่อและชนิดของข้อมูลของ Struct data type ใน data block editor  หรือ block interface editor
    • Array และ structure สามารถนำมารวมกันเป็นข้อมูลที่ใหญ่ขึ้นได้ โดยเราสามารถสร้าง nest ใน struct ได้มากสุดถึง 8 level
  • PLC Data type คือ user-defined data structure ที่เราสร้างขึ้นมาเองมีประโยชน์ในกรณีที่ต้องมีการนำมาใช้ต่ออีกหลายๆครั้ง  เมื่อเราได้สร้างข้อมูลแบบ PLC data type แล้ว เราจะสามารถเลือกได้จาก selector drop list ใน DB editor และ code block interface editor
  • Pointer
    • Pointer คือ indirect reference ให้กับ address ของ tag ซึ่งตัวมันกินพื้นที่ 6 bytes (48 bits) ในหน่วยความจำ และสามารถรวมข้อมูลดังนี้ในตัวแปรได้ คือ DB (หรือ 0 ถ้าไม่ได้เก็บใน DB), memory area in CPU และ memory address
    • Any คือ indirect reference ของ data area และระบุความยาวให้ด้วย point แบบ Any จะกินพื้นที่ 10 bytes ในหน่วยความจำและรวมถึงข้อมูลดังนี้ คือ Datatype of the data elements, number of data elements, memory area or DB number, และ “Byte.Bit” starting address of the data.
    • Variant คือ indirect reference ของ tags of different data types or parameters ข้อมูล pointer ชนิด variant นี้ไม่ได้กินพื้นที่ของหน่วยความจำ เพราะ variant pointer จะรู้แค่ structures และ individual structural components

ถึงแม้ว่าข้อมูลชนิด BCD ตามรูปแบบข้างล่างนี้ไม่ได้กล่าวไว้ใน Data Type แต่ก็สามารถใช้งานได้โดยการใช้คำสั่ง Conversion

  • BCD16 คือ BCD แบบ 16-bit (-999 ถึง 999)
  • BCD32 คือ BCD แบบ 32-bit (-9,999,999 ถึง 9,999,999).

Addressing Memory Area

  • Global Memory  : ได้แก่ input (I), output (Q) และ bit memory (M) ซึ่ง memory เหล่านี้สามารถเข้าถึงได้จาก code block ทุกตัวไม่มีข้อจำกัด
  • Data Block (DB) : เราสามารถใส่ DB เอาไว้ใน user program เพื่อเก็บข้อมูลสำหรับ code block  โดยข้อมูลที่เก็บไว้จะยังคงอยู่แม้ว่าการทำงานของแต่ละ code block จะจบลงไปแล้วก็ตาม
    • Global DB จะเก็บข้อมูลที่สามารถใช้ได้จากทุก code block ในขณะที่ Instance DB จะเก็บข้อมูลสำหรับ FB นั้นๆ
  • Temp Memory    : เมื่อไหร่ก็ตามที่ code block ถูกเรียก OS ของ CPU จะทำการ allocate temporary memory หรือ local memory ระหว่างที่ block ทำงาน และเมื่อ code block ทำงานเสร็จ CPU ก็จะ reallocate local memory นี้คืนเพื่อนำไปใช้ต่อใน code block อื่นๆ
concept_000
ขนาดของ DB ใน PLC แต่ละรุ่น

ในแต่ละ memory location มี address เป็นของตัวเองเฉพาะตัว เช่น I, Q หรือ M เป็นต้น ซึ่งใน user program ของเรา ก็จะใช้ address เหล่านี้ในการอ้าง memory location ด้วยเช่นกัน

การอ้างอิง address input (I) หรือ output (Q) เช่น %I0.3 หรือ %Q1.7 จะเป็นการเข้าถึงตัว process image แต่ถ้าหากเราต้องการ access physical input หรือ output โดยตรงแบบทันที ให้เราเพิ่ม “:P” เข้าไปต่อท้ายตัวแปรหรือ tag ที่ต้องการ (เช่น %I0.3:P, %Q1.7:P, หรือ “Stop:P”) ซึ่งคือการทำการ force input,output นั่นเอง  สำหรับรายละเอียดเพิ่มเติมของการ Force variable สามารถดูได้ในเรื่องของการ Forcing variables ในลำดับต่อไปconcept_001.png

ตัวอย่างการอ้างอิง address แบบ bit คือเราจะใส่ ข้อมูลดังนี้คือ Memory area (M), Byte (3) ตามด้วยจุด (.) และสุดท้ายคือ Bit address (4)  ตัวอย่างข้างล่างคือการใช้งาน bit ที่4 ของ M3 นั่นเอง

concept_002.png

Configuring the I/O in the CPU and I/O modules

เมื่อการทำการเพิ่มตัว CPU หรือ module ต่างๆลงไปใน software ตัวโปรแกรมจะทำการระบุ address ในแต่ละส่วนให้เราโดยอัตโนมัติ ซึ่งเราสามารถเปลี่ยน address เองก็ได้เช่นกัน ตัวอย่างเช่น

  • STEP7 จะ assign digital input และ output กลุ่มละ 8 bit (1 byte) ไม่ว่า module นั้นจะใช้ครบทุก bit หรือไม่ก็ตาม
  • STEP7 จะระบุตำแหน่งของ analog input และ output กลุ่มละ 2 โดย analog แต่ละกลุ่มกินพื้นที่ตัวละ 2 bytes (16 bits)  จากรูปข้างล่าง 64..67 คือ 64-65 และ 66-67

concept_003.png

รูปข้างบนแสดงตัวอย่างของ CPU1214C ซึ่งมือ module 2SM และ 1 SB ซึ่งจากตัวอย่างนี้ เราสามารถเปลี่ยน address ของ DI8x24VDC จาก 8 เป็น 2 ก็ได้ เพราะ address 2 ยังไม่มีการใช้งาน โดยตัว software จะช่วยบอกให้เราทราบว่าพื้นที่ที่เราจะเปลี่ยนนั้นเราระบุผิดขนาดหรือไม่ทับซ้อนกับตัวอื่นหรือไม่

PLC tag หรือ Data Block tag นั้น สามารถเข้าถึงแบบ slice หรือเข้าถึงในบางส่วนในรูปแบบ bit, byte หรือ word ก็ได้ขึ้นอยู่กับขนาดของตัวมันเอง โดยมีรูปแบบดังนี้

  • “”.xn (bit access)
  • “”.bn (byte access)
  • “”.wn (word access)
  • “”..xn (bit access)
  • “”..bn (byte access)
  • “”..wn (word access)

concept_004.png

  • Note:
    • ชนิดข้อมูลที่ใช้งานแบบ slice ได้คือ Byte, Char, Conn_Any, Date, DInt,
      DWord, Event_Any, Event_Att, Hw_Any, Hw_Device, HW_Interface, Hw_Io, Hw_Pwm, Hw_SubModule, Int, OB_Any, OB_Att, OB_Cyclic, OB_Delay, OB_WHINT, OB_PCYCLE, OB_STARTUP, OB_TIMEERROR, OB_Tod, Port, Rtm, SInt, Time, Time_Of_Day, UDInt, UInt, USInt และ Word.
    • PLC Tags ที่เป็นชนิด Real สามารถเข้าถึงแบบ slice ได้ แต่ data block tags แบบ Real จะไม่สามารถทำได้

ตัวอย่างการใช้งานข้อมูลแบบ slice โดยสมติว่า “DW” ถูกตั้งเป็น tag แบบ DWORD

concept_005

Accessing a tag with an AT overlay

นอกเหนือจากการเข้าถึงข้อมูลแบบ slice แล้ว เรายังมีวิธีการเข้าถึงบางส่วนของ tag ผ่านทาง AT overlay อีกด้วย โดย AT overlay คือ tag ที่อนุญาตให้เราเข้่าถึงข้อมูลผ่าน tag ที่เราได้ประกาศไว้แล้วของตัว standard access block ซึ่งข้อดีของการใช้งาน AT overlay คือสามารถประกาศ data type ที่แตกต่างกันได้

การการตั้ง overlay parameter นั้น ให้เราประกาศ parameter เพิ่มเติมหลังจากตัวแปรหลักที่ต้องการ แล้วใสชนิดของ datatype เป็น AT ซึ่งจะทำให้โปรแกรมสร้าง overlay ให้เรา จากนั้นเราสามารถกำหนดชนิดข้อมูลของ overlay เป็นข้อมูลย่อยต่อไปได้ หรือจะกำหนดเป็น struc หรือ array ก็ได้ เช่นตัวอย่างข้างล่างนี้

ตัวอย่างของการกำหนด B1 เป็น Byte และตัวแปรย่อย overlay ชื่อว่า OV กำหนดเป็น array ของ Bool 8 ตัวconcept_006.png

ตัวอย่างของการกำหนด DW1 เป็น DWord และตัวแปรย่อย overlay ชื่อว่า DW1_Struct ที่มีชนิดข้อมูลเป็น Struct ทำให้เราสามารถกำหนดตัวแปรย่อยใน Struct ได้อีกคือ W1 เป็น Word, B1 เป็น Byte และ BO1-BO8 เป็น Bool ทั้งหมด 8 ตัว ทำให้ชนิดข้อมูลครบ 32 bit ตามชนิดของ DWord ซึ่งเป็นตัวแปรใหญ่นั่นเองconcept_007

ในกรณีของตัวอย่างข้างบนนี้ DW1 เป็นข้อมูลแบบ 32 bit ถ้าหากเรากำหนดตามตัวอย่างข้างต้นแล้วจะทำให้ตัวแปรใน overlay ครบ 32 bit ตามข้อมูลใน DW1 แต่หากเรากำหนดข้อมูลใน overlay มากกว่าตัวแปร DW1 เช่นถ้าเราเพิ่ม BO9 เข้าไปอีกตัว เราก็จะ compile โปรแกรมไม่ผ่านนั่นเอง

ตัวอย่างการใช้งานตัวแปร overlay ในแบบต่างๆ ตามที่เราได้ตั้งไว้ข้างต้นconcept_008.png

กฎของการใช้งาน overlay

  1. Overlay tag สามารถใช้งานได้ใน FB และ FC แบบ standard access เท่านั้น (optimized ไม่ได้ ??? อาจจะได้แต่ตั้ง Retain เป็น Set in IDB ???? )
  2. ไม่สามารถทำ overlay ของ data type VARIANT ได้
  3. ขนาดของ overlay ต้องน้อยกว่าหรือเท่ากับตัวแปรหลัก (สังเกตว่าน้อยกว่าได้ แต่มากกว่าไม่ได้แน่ๆ)
  4. ต้องกำหนด AT หลังจากการสร้างตัวแปรนั้นทันที

Pulse Outputs

ตัว CPU หรือ signal board (SB) สามารถตั้งค่าให้เป็นตัวจ่าย pulse generators เพื่อใช้งาน high-speed pulse output functions ได้ถึง 4 channels โดยสามาถตั้งค่าเป็น pulse-width modulation (PWM) หรือเป็น pulse-train output (PTO) ก็ได้

การใช้งาน motion แบบพื้นฐานมักจะใช้ PTO outputs ซึ่งเราสามารถตั้งค่าแต่ละ pulse generator เพื่อเลือกใช้ PWM หรือ PTO ก็ได้ แต่ไม่สามารถใช้งานทั้งคู่ได้พร้อมกัน

Pulse outputs ไม่สามารถถูกใช้งานจากคำสั่งอื่นๆ ใน user program ได้ เมื่อเราทำการตั้งค่า outputs ของ CPU หรือ SB ให้เป็น pulse generators แล้ว output address นั้นๆจะถูกดึงออกจากการใช้งาน Q memory และไม่สามารถใช้เพื่อวัตถุประสงค์อื่นใน user program ได้  เช่นหากเราทำการเขียนค่า output ที่ถูกกำหนดค่าเป็น pulse generator แล้ว ตัว CPU จะไม่เขียนค่าให้ output อยู่ดี

อย่าจ่ายค่า pulse frequency เกินค่า maximum

ค่า maximum pulse frequency ของ pulse output generators คือ 1 MHz สำหรับ CPU 1217C
และมีค่า 100 kHz สำหรับ CPUs 1211C, 1212C, 1214C, and 1215C, มีค่า 20 kHz สำหรับ standard SB หรือ 200 kHz สำหรับ high-speed SB เป็นต้น

Pulse generators ทั้ง 4 จะมี I/O assignments ที่เป็น default อยู่ อย่างไรก็ตามเราสามารถตั้งค่าให้เป็น digital output ตัวใดก็ได้ใน CPU or SB

เราไม่สามารถตั้ง pulse generators ให้กับ SM หรือ distributed I/O ได้

เมื่อเราตั้งค่าให้เพื่อใช้งานเกี่ยวกับ basic motion ให้พึงระวังว่าโปรแกรม STEP7 จะไม่เตือนเราถ้าเราตั้งให้แกนนั้นๆให้ทำงานที่ maximum speed/frequency ซึ่งเกินค่าของข้อจำกัดของตัว hardware เอง ดังนั้นเราต้องมั่นใจว่าไม่ได้ทำการสั่งงานเกินค่า maximum pulse frequency ของตัว hardware

เราสามารถเลือกใช้ pulse generator จาก CPU outputs หรือจาก optional signal board outputs ก็ได้ ซึ่งจะมี default I/O assignment ตามตารางด้านล่างนี้ (แต่เราก็สามารถทำการเปลี่ยนตัว output เป็นเบอร์อื่นๆ ก็ได้)

อย่าลืมว่า PWM นั้นต้องการเพียงแค่ output ตัวเดียว ในขณะที่ PTO สามารถเลือกใช้งาน 1 หรือ 2 outputs (pulse + direction) ต่อ channel ก็ได้ ดังนั้นหาก output นั้นไม่ต้องการใช้งาน pulse function ก็สามารถนำไปใช้งานในส่วนอื่นๆได้
concept_009

1 CPU 1211C ไม่มี Q0.4, Q0.5, Q0.6, or Q0.7 ดังนั้นไม่สามารถใช้ outputs เหล่านี้กับ CPU 1211C.
2 CPU 1212C ไม่มี Q0.6 or Q0.7 ดังนั้นไม่สามารถใช้ outputs เหล่านี้กับ CPU 1212C
3 ตารางนี้ใช้อ้างอิงกับ CPU 1211C, CPU 1212C, CPU 1214C, CPU 1215C, and CPU 1217C
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s